aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c69
1 files changed, 34 insertions, 35 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 359e0f279b71..df6c6f51c609 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -13,7 +13,6 @@
13#include <linux/interrupt.h> 13#include <linux/interrupt.h>
14#include <linux/aer.h> 14#include <linux/aer.h>
15 15
16#define QLCNIC_MAX_TX_QUEUES 1
17#define RSS_HASHTYPE_IP_TCP 0x3 16#define RSS_HASHTYPE_IP_TCP 0x3
18#define QLC_83XX_FW_MBX_CMD 0 17#define QLC_83XX_FW_MBX_CMD 0
19 18
@@ -268,20 +267,18 @@ int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
268 } 267 }
269} 268}
270 269
271int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr, int txq) 270int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter)
272{ 271{
273 int err, i, num_msix; 272 int err, i, num_msix;
274 struct qlcnic_hardware_context *ahw = adapter->ahw; 273 struct qlcnic_hardware_context *ahw = adapter->ahw;
275 274
276 if (!num_intr) 275 num_msix = adapter->drv_sds_rings;
277 num_intr = QLCNIC_DEF_NUM_STS_DESC_RINGS; 276
278 num_msix = rounddown_pow_of_two(min_t(int, num_online_cpus(),
279 num_intr));
280 /* account for AEN interrupt MSI-X based interrupts */ 277 /* account for AEN interrupt MSI-X based interrupts */
281 num_msix += 1; 278 num_msix += 1;
282 279
283 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) 280 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED))
284 num_msix += adapter->max_drv_tx_rings; 281 num_msix += adapter->drv_tx_rings;
285 282
286 err = qlcnic_enable_msix(adapter, num_msix); 283 err = qlcnic_enable_msix(adapter, num_msix);
287 if (err == -ENOMEM) 284 if (err == -ENOMEM)
@@ -986,14 +983,14 @@ static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter)
986 983
987 sds_mbx_size = sizeof(struct qlcnic_sds_mbx); 984 sds_mbx_size = sizeof(struct qlcnic_sds_mbx);
988 context_id = recv_ctx->context_id; 985 context_id = recv_ctx->context_id;
989 num_sds = (adapter->max_sds_rings - QLCNIC_MAX_RING_SETS); 986 num_sds = adapter->drv_sds_rings - QLCNIC_MAX_SDS_RINGS;
990 ahw->hw_ops->alloc_mbx_args(&cmd, adapter, 987 ahw->hw_ops->alloc_mbx_args(&cmd, adapter,
991 QLCNIC_CMD_ADD_RCV_RINGS); 988 QLCNIC_CMD_ADD_RCV_RINGS);
992 cmd.req.arg[1] = 0 | (num_sds << 8) | (context_id << 16); 989 cmd.req.arg[1] = 0 | (num_sds << 8) | (context_id << 16);
993 990
994 /* set up status rings, mbx 2-81 */ 991 /* set up status rings, mbx 2-81 */
995 index = 2; 992 index = 2;
996 for (i = 8; i < adapter->max_sds_rings; i++) { 993 for (i = 8; i < adapter->drv_sds_rings; i++) {
997 memset(&sds_mbx, 0, sds_mbx_size); 994 memset(&sds_mbx, 0, sds_mbx_size);
998 sds = &recv_ctx->sds_rings[i]; 995 sds = &recv_ctx->sds_rings[i];
999 sds->consumer = 0; 996 sds->consumer = 0;
@@ -1028,7 +1025,7 @@ static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter)
1028 mbx_out = (struct qlcnic_add_rings_mbx_out *)&cmd.rsp.arg[1]; 1025 mbx_out = (struct qlcnic_add_rings_mbx_out *)&cmd.rsp.arg[1];
1029 index = 0; 1026 index = 0;
1030 /* status descriptor ring */ 1027 /* status descriptor ring */
1031 for (i = 8; i < adapter->max_sds_rings; i++) { 1028 for (i = 8; i < adapter->drv_sds_rings; i++) {
1032 sds = &recv_ctx->sds_rings[i]; 1029 sds = &recv_ctx->sds_rings[i];
1033 sds->crb_sts_consumer = ahw->pci_base0 + 1030 sds->crb_sts_consumer = ahw->pci_base0 +
1034 mbx_out->host_csmr[index]; 1031 mbx_out->host_csmr[index];
@@ -1086,10 +1083,10 @@ int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter)
1086 struct qlcnic_hardware_context *ahw = adapter->ahw; 1083 struct qlcnic_hardware_context *ahw = adapter->ahw;
1087 num_rds = adapter->max_rds_rings; 1084 num_rds = adapter->max_rds_rings;
1088 1085
1089 if (adapter->max_sds_rings <= QLCNIC_MAX_RING_SETS) 1086 if (adapter->drv_sds_rings <= QLCNIC_MAX_SDS_RINGS)
1090 num_sds = adapter->max_sds_rings; 1087 num_sds = adapter->drv_sds_rings;
1091 else 1088 else
1092 num_sds = QLCNIC_MAX_RING_SETS; 1089 num_sds = QLCNIC_MAX_SDS_RINGS;
1093 1090
1094 sds_mbx_size = sizeof(struct qlcnic_sds_mbx); 1091 sds_mbx_size = sizeof(struct qlcnic_sds_mbx);
1095 rds_mbx_size = sizeof(struct qlcnic_rds_mbx); 1092 rds_mbx_size = sizeof(struct qlcnic_rds_mbx);
@@ -1190,7 +1187,7 @@ int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter)
1190 sds->crb_intr_mask = ahw->pci_base0 + intr_mask; 1187 sds->crb_intr_mask = ahw->pci_base0 + intr_mask;
1191 } 1188 }
1192 1189
1193 if (adapter->max_sds_rings > QLCNIC_MAX_RING_SETS) 1190 if (adapter->drv_sds_rings > QLCNIC_MAX_SDS_RINGS)
1194 err = qlcnic_83xx_add_rings(adapter); 1191 err = qlcnic_83xx_add_rings(adapter);
1195out: 1192out:
1196 qlcnic_free_mbx_args(&cmd); 1193 qlcnic_free_mbx_args(&cmd);
@@ -1246,9 +1243,9 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter,
1246 mbx.size = tx->num_desc; 1243 mbx.size = tx->num_desc;
1247 if (adapter->flags & QLCNIC_MSIX_ENABLED) { 1244 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
1248 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) 1245 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED))
1249 msix_vector = adapter->max_sds_rings + ring; 1246 msix_vector = adapter->drv_sds_rings + ring;
1250 else 1247 else
1251 msix_vector = adapter->max_sds_rings - 1; 1248 msix_vector = adapter->drv_sds_rings - 1;
1252 msix_id = ahw->intr_tbl[msix_vector].id; 1249 msix_id = ahw->intr_tbl[msix_vector].id;
1253 } else { 1250 } else {
1254 msix_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); 1251 msix_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID);
@@ -1271,7 +1268,8 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter,
1271 qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp); 1268 qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp);
1272 1269
1273 cmd.req.arg[1] = QLCNIC_CAP0_LEGACY_CONTEXT; 1270 cmd.req.arg[1] = QLCNIC_CAP0_LEGACY_CONTEXT;
1274 cmd.req.arg[5] = QLCNIC_MAX_TX_QUEUES | temp; 1271 cmd.req.arg[5] = QLCNIC_SINGLE_RING | temp;
1272
1275 buf = &cmd.req.arg[6]; 1273 buf = &cmd.req.arg[6];
1276 memcpy(buf, &mbx, sizeof(struct qlcnic_tx_mbx)); 1274 memcpy(buf, &mbx, sizeof(struct qlcnic_tx_mbx));
1277 /* send the mailbox command*/ 1275 /* send the mailbox command*/
@@ -1286,7 +1284,7 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter,
1286 tx->ctx_id = mbx_out->ctx_id; 1284 tx->ctx_id = mbx_out->ctx_id;
1287 if ((adapter->flags & QLCNIC_MSIX_ENABLED) && 1285 if ((adapter->flags & QLCNIC_MSIX_ENABLED) &&
1288 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { 1286 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) {
1289 intr_mask = ahw->intr_tbl[adapter->max_sds_rings + ring].src; 1287 intr_mask = ahw->intr_tbl[adapter->drv_sds_rings + ring].src;
1290 tx->crb_intr_mask = ahw->pci_base0 + intr_mask; 1288 tx->crb_intr_mask = ahw->pci_base0 + intr_mask;
1291 } 1289 }
1292 dev_info(&adapter->pdev->dev, "Tx Context[0x%x] Created, state:0x%x\n", 1290 dev_info(&adapter->pdev->dev, "Tx Context[0x%x] Created, state:0x%x\n",
@@ -1297,7 +1295,7 @@ out:
1297} 1295}
1298 1296
1299static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, 1297static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
1300 int num_sds_ring) 1298 u8 num_sds_ring)
1301{ 1299{
1302 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1300 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1303 struct qlcnic_host_sds_ring *sds_ring; 1301 struct qlcnic_host_sds_ring *sds_ring;
@@ -1313,7 +1311,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
1313 1311
1314 qlcnic_detach(adapter); 1312 qlcnic_detach(adapter);
1315 1313
1316 adapter->max_sds_rings = 1; 1314 adapter->drv_sds_rings = QLCNIC_SINGLE_RING;
1317 adapter->ahw->diag_test = test; 1315 adapter->ahw->diag_test = test;
1318 adapter->ahw->linkup = 0; 1316 adapter->ahw->linkup = 0;
1319 1317
@@ -1327,7 +1325,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
1327 if (ret) { 1325 if (ret) {
1328 qlcnic_detach(adapter); 1326 qlcnic_detach(adapter);
1329 if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) { 1327 if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) {
1330 adapter->max_sds_rings = num_sds_ring; 1328 adapter->drv_sds_rings = num_sds_ring;
1331 qlcnic_attach(adapter); 1329 qlcnic_attach(adapter);
1332 } 1330 }
1333 netif_device_attach(netdev); 1331 netif_device_attach(netdev);
@@ -1340,7 +1338,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
1340 } 1338 }
1341 1339
1342 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { 1340 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1343 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 1341 for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
1344 sds_ring = &adapter->recv_ctx->sds_rings[ring]; 1342 sds_ring = &adapter->recv_ctx->sds_rings[ring];
1345 qlcnic_83xx_enable_intr(adapter, sds_ring); 1343 qlcnic_83xx_enable_intr(adapter, sds_ring);
1346 } 1344 }
@@ -1361,7 +1359,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test,
1361} 1359}
1362 1360
1363static void qlcnic_83xx_diag_free_res(struct net_device *netdev, 1361static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
1364 int max_sds_rings) 1362 u8 drv_sds_rings)
1365{ 1363{
1366 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1364 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1367 struct qlcnic_host_sds_ring *sds_ring; 1365 struct qlcnic_host_sds_ring *sds_ring;
@@ -1369,7 +1367,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
1369 1367
1370 clear_bit(__QLCNIC_DEV_UP, &adapter->state); 1368 clear_bit(__QLCNIC_DEV_UP, &adapter->state);
1371 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { 1369 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1372 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 1370 for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
1373 sds_ring = &adapter->recv_ctx->sds_rings[ring]; 1371 sds_ring = &adapter->recv_ctx->sds_rings[ring];
1374 qlcnic_83xx_disable_intr(adapter, sds_ring); 1372 qlcnic_83xx_disable_intr(adapter, sds_ring);
1375 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) 1373 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
@@ -1393,7 +1391,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
1393 } 1391 }
1394 } 1392 }
1395 adapter->ahw->diag_test = 0; 1393 adapter->ahw->diag_test = 0;
1396 adapter->max_sds_rings = max_sds_rings; 1394 adapter->drv_sds_rings = drv_sds_rings;
1397 1395
1398 if (qlcnic_attach(adapter)) 1396 if (qlcnic_attach(adapter))
1399 goto out; 1397 goto out;
@@ -1655,7 +1653,8 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1655{ 1653{
1656 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1654 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1657 struct qlcnic_hardware_context *ahw = adapter->ahw; 1655 struct qlcnic_hardware_context *ahw = adapter->ahw;
1658 int ret = 0, loop = 0, max_sds_rings = adapter->max_sds_rings; 1656 u8 drv_sds_rings = adapter->drv_sds_rings;
1657 int ret = 0, loop = 0;
1659 1658
1660 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1659 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1661 netdev_warn(netdev, 1660 netdev_warn(netdev,
@@ -1677,7 +1676,7 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1677 mode == QLCNIC_ILB_MODE ? "internal" : "external"); 1676 mode == QLCNIC_ILB_MODE ? "internal" : "external");
1678 1677
1679 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, 1678 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST,
1680 max_sds_rings); 1679 drv_sds_rings);
1681 if (ret) 1680 if (ret)
1682 goto fail_diag_alloc; 1681 goto fail_diag_alloc;
1683 1682
@@ -1715,10 +1714,10 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1715 qlcnic_83xx_clear_lb_mode(adapter, mode); 1714 qlcnic_83xx_clear_lb_mode(adapter, mode);
1716 1715
1717free_diag_res: 1716free_diag_res:
1718 qlcnic_83xx_diag_free_res(netdev, max_sds_rings); 1717 qlcnic_83xx_diag_free_res(netdev, drv_sds_rings);
1719 1718
1720fail_diag_alloc: 1719fail_diag_alloc:
1721 adapter->max_sds_rings = max_sds_rings; 1720 adapter->drv_sds_rings = drv_sds_rings;
1722 qlcnic_release_diag_lock(adapter); 1721 qlcnic_release_diag_lock(adapter);
1723 return ret; 1722 return ret;
1724} 1723}
@@ -3303,10 +3302,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3303 struct qlcnic_adapter *adapter = netdev_priv(netdev); 3302 struct qlcnic_adapter *adapter = netdev_priv(netdev);
3304 struct qlcnic_hardware_context *ahw = adapter->ahw; 3303 struct qlcnic_hardware_context *ahw = adapter->ahw;
3305 struct qlcnic_cmd_args cmd; 3304 struct qlcnic_cmd_args cmd;
3305 u8 val, drv_sds_rings = adapter->drv_sds_rings;
3306 u32 data; 3306 u32 data;
3307 u16 intrpt_id, id; 3307 u16 intrpt_id, id;
3308 u8 val; 3308 int ret;
3309 int ret, max_sds_rings = adapter->max_sds_rings;
3310 3309
3311 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 3310 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
3312 netdev_info(netdev, "Device is resetting\n"); 3311 netdev_info(netdev, "Device is resetting\n");
@@ -3319,7 +3318,7 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3319 } 3318 }
3320 3319
3321 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, 3320 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST,
3322 max_sds_rings); 3321 drv_sds_rings);
3323 if (ret) 3322 if (ret)
3324 goto fail_diag_irq; 3323 goto fail_diag_irq;
3325 3324
@@ -3356,10 +3355,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3356 3355
3357done: 3356done:
3358 qlcnic_free_mbx_args(&cmd); 3357 qlcnic_free_mbx_args(&cmd);
3359 qlcnic_83xx_diag_free_res(netdev, max_sds_rings); 3358 qlcnic_83xx_diag_free_res(netdev, drv_sds_rings);
3360 3359
3361fail_diag_irq: 3360fail_diag_irq:
3362 adapter->max_sds_rings = max_sds_rings; 3361 adapter->drv_sds_rings = drv_sds_rings;
3363 qlcnic_release_diag_lock(adapter); 3362 qlcnic_release_diag_lock(adapter);
3364 return ret; 3363 return ret;
3365} 3364}
@@ -3513,7 +3512,7 @@ int qlcnic_83xx_resume(struct qlcnic_adapter *adapter)
3513 if (err) 3512 if (err)
3514 return err; 3513 return err;
3515 3514
3516 if (ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE) { 3515 if (ahw->nic_mode == QLCNIC_VNIC_MODE) {
3517 if (ahw->op_mode == QLCNIC_MGMT_FUNC) { 3516 if (ahw->op_mode == QLCNIC_MGMT_FUNC) {
3518 qlcnic_83xx_set_vnic_opmode(adapter); 3517 qlcnic_83xx_set_vnic_opmode(adapter);
3519 } else { 3518 } else {