mirror of
https://github.com/adulau/aha.git
synced 2025-01-04 07:03:38 +00:00
NetXen: Multi PCI support for Quad cards
NetXen: Fix the multi PCI function for cards with more than 2 ports. This patch fixes the working of multi PCI capable driver on cards with more than 2 ports by adding the addresses for their rings and sizes. Signed-off by: Mithlesh Thukral <mithlesh@netxen.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
13ba9c7714
commit
595e3fb8cf
4 changed files with 144 additions and 42 deletions
|
@ -143,8 +143,105 @@ struct netxen_recv_crb recv_crb_registers[] = {
|
||||||
NETXEN_NIC_REG(0x180),
|
NETXEN_NIC_REG(0x180),
|
||||||
/* crb_status_ring_size */
|
/* crb_status_ring_size */
|
||||||
NETXEN_NIC_REG(0x184),
|
NETXEN_NIC_REG(0x184),
|
||||||
|
|
||||||
},
|
},
|
||||||
|
/*
|
||||||
|
* Instance 3,
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x1d8),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x1dc),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x1f0),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x1f4),
|
||||||
|
},
|
||||||
|
/* Jumbo frames */
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x1f8),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x1fc),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x200),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x204),
|
||||||
|
},
|
||||||
|
/* LRO */
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x208),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x20c),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x210),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x214),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* crb_rcvstatus_ring: */
|
||||||
|
NETXEN_NIC_REG(0x218),
|
||||||
|
/* crb_rcv_status_producer: */
|
||||||
|
NETXEN_NIC_REG(0x21c),
|
||||||
|
/* crb_rcv_status_consumer: */
|
||||||
|
NETXEN_NIC_REG(0x220),
|
||||||
|
/* crb_rcvpeg_state: */
|
||||||
|
NETXEN_NIC_REG(0x224),
|
||||||
|
/* crb_status_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x228),
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* Instance 4,
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x22c),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x230),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x234),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x238),
|
||||||
|
},
|
||||||
|
/* Jumbo frames */
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x23c),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x240),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x244),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x248),
|
||||||
|
},
|
||||||
|
/* LRO */
|
||||||
|
{
|
||||||
|
/* crb_rcv_producer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x24c),
|
||||||
|
/* crb_rcv_consumer_offset: */
|
||||||
|
NETXEN_NIC_REG(0x250),
|
||||||
|
/* crb_gloablrcv_ring: */
|
||||||
|
NETXEN_NIC_REG(0x254),
|
||||||
|
/* crb_rcv_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x258),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* crb_rcvstatus_ring: */
|
||||||
|
NETXEN_NIC_REG(0x25c),
|
||||||
|
/* crb_rcv_status_producer: */
|
||||||
|
NETXEN_NIC_REG(0x260),
|
||||||
|
/* crb_rcv_status_consumer: */
|
||||||
|
NETXEN_NIC_REG(0x264),
|
||||||
|
/* crb_rcvpeg_state: */
|
||||||
|
NETXEN_NIC_REG(0x268),
|
||||||
|
/* crb_status_ring_size */
|
||||||
|
NETXEN_NIC_REG(0x26c),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
u64 ctx_addr_sig_regs[][3] = {
|
u64 ctx_addr_sig_regs[][3] = {
|
||||||
|
@ -296,6 +393,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
|
||||||
u32 card_cmdring = 0;
|
u32 card_cmdring = 0;
|
||||||
struct netxen_recv_context *recv_ctx;
|
struct netxen_recv_context *recv_ctx;
|
||||||
struct netxen_rcv_desc_ctx *rcv_desc;
|
struct netxen_rcv_desc_ctx *rcv_desc;
|
||||||
|
int func_id = adapter->portnum;
|
||||||
|
|
||||||
DPRINTK(INFO, "crb_base: %lx %x", NETXEN_PCI_CRBSPACE,
|
DPRINTK(INFO, "crb_base: %lx %x", NETXEN_PCI_CRBSPACE,
|
||||||
PCI_OFFSET_SECOND_RANGE(adapter, NETXEN_PCI_CRBSPACE));
|
PCI_OFFSET_SECOND_RANGE(adapter, NETXEN_PCI_CRBSPACE));
|
||||||
|
@ -351,6 +449,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
|
||||||
}
|
}
|
||||||
memset(addr, 0, sizeof(struct netxen_ring_ctx));
|
memset(addr, 0, sizeof(struct netxen_ring_ctx));
|
||||||
adapter->ctx_desc = (struct netxen_ring_ctx *)addr;
|
adapter->ctx_desc = (struct netxen_ring_ctx *)addr;
|
||||||
|
adapter->ctx_desc->ctx_id = adapter->portnum;
|
||||||
adapter->ctx_desc->cmd_consumer_offset =
|
adapter->ctx_desc->cmd_consumer_offset =
|
||||||
cpu_to_le64(adapter->ctx_desc_phys_addr +
|
cpu_to_le64(adapter->ctx_desc_phys_addr +
|
||||||
sizeof(struct netxen_ring_ctx));
|
sizeof(struct netxen_ring_ctx));
|
||||||
|
@ -421,11 +520,11 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter)
|
||||||
/* Window = 1 */
|
/* Window = 1 */
|
||||||
|
|
||||||
writel(lower32(adapter->ctx_desc_phys_addr),
|
writel(lower32(adapter->ctx_desc_phys_addr),
|
||||||
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_LO));
|
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_LO(func_id)));
|
||||||
writel(upper32(adapter->ctx_desc_phys_addr),
|
writel(upper32(adapter->ctx_desc_phys_addr),
|
||||||
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_HI));
|
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_ADDR_REG_HI(func_id)));
|
||||||
writel(NETXEN_CTX_SIGNATURE,
|
writel(NETXEN_CTX_SIGNATURE | func_id,
|
||||||
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_SIGNATURE_REG));
|
NETXEN_CRB_NORMALIZE(adapter, CRB_CTX_SIGNATURE_REG(func_id)));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -965,9 +1064,11 @@ int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu)
|
||||||
{
|
{
|
||||||
new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE;
|
new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE;
|
||||||
if (adapter->portnum == 0)
|
if (adapter->portnum == 0)
|
||||||
netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu);
|
netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE,
|
||||||
|
new_mtu);
|
||||||
else if (adapter->portnum == 1)
|
else if (adapter->portnum == 1)
|
||||||
netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu);
|
netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE,
|
||||||
|
new_mtu);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,6 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
|
||||||
adapter->unset_promisc = netxen_niu_set_promiscuous_mode;
|
adapter->unset_promisc = netxen_niu_set_promiscuous_mode;
|
||||||
adapter->phy_read = netxen_niu_gbe_phy_read;
|
adapter->phy_read = netxen_niu_gbe_phy_read;
|
||||||
adapter->phy_write = netxen_niu_gbe_phy_write;
|
adapter->phy_write = netxen_niu_gbe_phy_write;
|
||||||
adapter->init_port = netxen_niu_gbe_init_port;
|
|
||||||
adapter->init_niu = netxen_nic_init_niu_gb;
|
adapter->init_niu = netxen_nic_init_niu_gb;
|
||||||
adapter->stop_port = netxen_niu_disable_gbe_port;
|
adapter->stop_port = netxen_niu_disable_gbe_port;
|
||||||
break;
|
break;
|
||||||
|
@ -438,7 +437,6 @@ do_rom_fast_read_words(struct netxen_adapter *adapter, int addr,
|
||||||
|
|
||||||
for (addridx = addr; addridx < (addr + size); addridx += 4) {
|
for (addridx = addr; addridx < (addr + size); addridx += 4) {
|
||||||
ret = do_rom_fast_read(adapter, addridx, (int *)bytes);
|
ret = do_rom_fast_read(adapter, addridx, (int *)bytes);
|
||||||
*(int *)bytes = cpu_to_le32(*(int *)bytes);
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
break;
|
break;
|
||||||
bytes += 4;
|
bytes += 4;
|
||||||
|
@ -498,7 +496,7 @@ static inline int do_rom_fast_write_words(struct netxen_adapter *adapter,
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
data = le32_to_cpu((*(u32*)bytes));
|
data = *(u32*)bytes;
|
||||||
|
|
||||||
ret = do_rom_fast_write(adapter, addridx, data);
|
ret = do_rom_fast_write(adapter, addridx, data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
|
@ -286,7 +286,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
|
adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
|
||||||
adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
|
adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
|
||||||
|
|
||||||
pci_set_drvdata(pdev, adapter);
|
pci_set_drvdata(pdev, netdev);
|
||||||
|
|
||||||
adapter->netdev = netdev;
|
adapter->netdev = netdev;
|
||||||
adapter->pdev = pdev;
|
adapter->pdev = pdev;
|
||||||
|
@ -388,6 +388,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
adapter->ahw.db_len = db_len;
|
adapter->ahw.db_len = db_len;
|
||||||
spin_lock_init(&adapter->tx_lock);
|
spin_lock_init(&adapter->tx_lock);
|
||||||
spin_lock_init(&adapter->lock);
|
spin_lock_init(&adapter->lock);
|
||||||
|
/* initialize the adapter */
|
||||||
|
netxen_initialize_adapter_hw(adapter);
|
||||||
|
|
||||||
|
netxen_initialize_adapter_ops(adapter);
|
||||||
|
|
||||||
netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */
|
netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */
|
||||||
/* Mezz cards have PCI function 0,2,3 enabled */
|
/* Mezz cards have PCI function 0,2,3 enabled */
|
||||||
if (adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ)
|
if (adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ)
|
||||||
|
@ -412,11 +417,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
* initializing the ports
|
* initializing the ports
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* initialize the adapter */
|
|
||||||
netxen_initialize_adapter_hw(adapter);
|
|
||||||
|
|
||||||
netxen_initialize_adapter_ops(adapter);
|
|
||||||
|
|
||||||
init_timer(&adapter->watchdog_timer);
|
init_timer(&adapter->watchdog_timer);
|
||||||
adapter->ahw.xg_linkup = 0;
|
adapter->ahw.xg_linkup = 0;
|
||||||
adapter->watchdog_timer.function = &netxen_watchdog;
|
adapter->watchdog_timer.function = &netxen_watchdog;
|
||||||
|
@ -578,8 +578,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
||||||
int i;
|
int i;
|
||||||
int ctxid, ring;
|
int ctxid, ring;
|
||||||
|
|
||||||
adapter = pci_get_drvdata(pdev);
|
netdev = pci_get_drvdata(pdev);
|
||||||
netdev = adapter->netdev;
|
adapter = netdev_priv(netdev);
|
||||||
if (adapter == NULL)
|
if (adapter == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -588,15 +588,15 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
||||||
|
|
||||||
if (adapter->irq)
|
if (adapter->irq)
|
||||||
free_irq(adapter->irq, adapter);
|
free_irq(adapter->irq, adapter);
|
||||||
/* leave the hw in the same state as reboot */
|
if(adapter->portnum == 0) {
|
||||||
writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
|
/* leave the hw in the same state as reboot */
|
||||||
netxen_pinit_from_rom(adapter, 0);
|
writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
|
||||||
netxen_load_firmware(adapter);
|
netxen_pinit_from_rom(adapter, 0);
|
||||||
netxen_free_adapter_offload(adapter);
|
netxen_load_firmware(adapter);
|
||||||
|
netxen_free_adapter_offload(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
udelay(500);
|
udelay(500);
|
||||||
unregister_netdev(netdev);
|
|
||||||
free_netdev(netdev);
|
|
||||||
|
|
||||||
if ((adapter->flags & NETXEN_NIC_MSI_ENABLED))
|
if ((adapter->flags & NETXEN_NIC_MSI_ENABLED))
|
||||||
pci_disable_msi(pdev);
|
pci_disable_msi(pdev);
|
||||||
|
@ -608,10 +608,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
||||||
iounmap(adapter->ahw.pci_base1);
|
iounmap(adapter->ahw.pci_base1);
|
||||||
iounmap(adapter->ahw.pci_base2);
|
iounmap(adapter->ahw.pci_base2);
|
||||||
|
|
||||||
pci_release_regions(pdev);
|
|
||||||
pci_disable_device(pdev);
|
|
||||||
pci_set_drvdata(pdev, NULL);
|
|
||||||
|
|
||||||
for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
|
for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
|
||||||
recv_ctx = &adapter->recv_ctx[ctxid];
|
recv_ctx = &adapter->recv_ctx[ctxid];
|
||||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
||||||
|
@ -631,7 +627,13 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
vfree(adapter->cmd_buf_arr);
|
vfree(adapter->cmd_buf_arr);
|
||||||
kfree(adapter);
|
unregister_netdev(netdev);
|
||||||
|
free_netdev(netdev);
|
||||||
|
|
||||||
|
pci_release_regions(pdev);
|
||||||
|
pci_disable_device(pdev);
|
||||||
|
pci_set_drvdata(pdev, NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -651,8 +653,6 @@ static int netxen_nic_open(struct net_device *netdev)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
netxen_nic_flash_print(adapter);
|
netxen_nic_flash_print(adapter);
|
||||||
if (adapter->init_niu)
|
|
||||||
adapter->init_niu(adapter);
|
|
||||||
|
|
||||||
/* setup all the resources for the Phantom... */
|
/* setup all the resources for the Phantom... */
|
||||||
/* this include the descriptors for rcv, tx, and status */
|
/* this include the descriptors for rcv, tx, and status */
|
||||||
|
@ -663,13 +663,6 @@ static int netxen_nic_open(struct net_device *netdev)
|
||||||
err);
|
err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (adapter->init_port
|
|
||||||
&& adapter->init_port(adapter, adapter->portnum) != 0) {
|
|
||||||
printk(KERN_ERR "%s: Failed to initialize port %d\n",
|
|
||||||
netxen_nic_driver_name, adapter->portnum);
|
|
||||||
netxen_free_hw_resources(adapter);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
||||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++)
|
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++)
|
||||||
netxen_post_rx_buffers(adapter, ctx, ring);
|
netxen_post_rx_buffers(adapter, ctx, ring);
|
||||||
|
@ -695,6 +688,15 @@ static int netxen_nic_open(struct net_device *netdev)
|
||||||
* we set it */
|
* we set it */
|
||||||
if (adapter->macaddr_set)
|
if (adapter->macaddr_set)
|
||||||
adapter->macaddr_set(adapter, netdev->dev_addr);
|
adapter->macaddr_set(adapter, netdev->dev_addr);
|
||||||
|
if (adapter->init_port
|
||||||
|
&& adapter->init_port(adapter, adapter->portnum) != 0) {
|
||||||
|
printk(KERN_ERR "%s: Failed to initialize port %d\n",
|
||||||
|
netxen_nic_driver_name, adapter->portnum);
|
||||||
|
free_irq(adapter->irq, adapter);
|
||||||
|
netxen_free_hw_resources(adapter);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
netxen_nic_set_link_parameters(adapter);
|
netxen_nic_set_link_parameters(adapter);
|
||||||
|
|
||||||
netxen_nic_set_multi(netdev);
|
netxen_nic_set_multi(netdev);
|
||||||
|
@ -1028,6 +1030,7 @@ netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev)
|
||||||
u32 ret = 0;
|
u32 ret = 0;
|
||||||
|
|
||||||
DPRINTK(INFO, "Entered handle ISR\n");
|
DPRINTK(INFO, "Entered handle ISR\n");
|
||||||
|
adapter->stats.ints++;
|
||||||
|
|
||||||
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
|
@ -151,9 +151,9 @@ struct netxen_recv_crb {
|
||||||
extern struct netxen_recv_crb recv_crb_registers[];
|
extern struct netxen_recv_crb recv_crb_registers[];
|
||||||
extern u64 ctx_addr_sig_regs[][3];
|
extern u64 ctx_addr_sig_regs[][3];
|
||||||
#endif /* DEFINE_GLOBAL_RECEIVE_CRB */
|
#endif /* DEFINE_GLOBAL_RECEIVE_CRB */
|
||||||
#define CRB_CTX_ADDR_REG_LO (ctx_addr_sig_regs[0][0])
|
#define CRB_CTX_ADDR_REG_LO(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][0])
|
||||||
#define CRB_CTX_ADDR_REG_HI (ctx_addr_sig_regs[0][2])
|
#define CRB_CTX_ADDR_REG_HI(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][2])
|
||||||
#define CRB_CTX_SIGNATURE_REG (ctx_addr_sig_regs[0][1])
|
#define CRB_CTX_SIGNATURE_REG(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][1])
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Temperature control.
|
* Temperature control.
|
||||||
|
|
Loading…
Reference in a new issue