Commit ee87a82a28cddbb9267a294172ecb3d3d3bdaa6c

Authored by Michael Chan
Committed by David S. Miller
1 parent a3ceeeb8f1

cnic: Add support for 57712 device

Add new interrupt ack functions and other hardware interface logic to
support the new device.

Update version to 2.2.6.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 3 changed files with 103 additions and 17 deletions Side-by-side Diff

... ... @@ -1077,7 +1077,7 @@
1077 1077  
1078 1078 cp->ctx_blks = blks;
1079 1079 cp->ctx_blk_size = ctx_blk_size;
1080   - if (BNX2X_CHIP_IS_E1H(cp->chip_id))
  1080 + if (!BNX2X_CHIP_IS_57710(cp->chip_id))
1081 1081 cp->ctx_align = 0;
1082 1082 else
1083 1083 cp->ctx_align = ctx_blk_size;
... ... @@ -2406,6 +2406,22 @@
2406 2406 CNIC_WR(dev, hc_addr, (*(u32 *)&igu_ack));
2407 2407 }
2408 2408  
  2409 +static void cnic_ack_igu_sb(struct cnic_dev *dev, u8 igu_sb_id, u8 segment,
  2410 + u16 index, u8 op, u8 update)
  2411 +{
  2412 + struct igu_regular cmd_data;
  2413 + u32 igu_addr = BAR_IGU_INTMEM + (IGU_CMD_INT_ACK_BASE + igu_sb_id) * 8;
  2414 +
  2415 + cmd_data.sb_id_and_flags =
  2416 + (index << IGU_REGULAR_SB_INDEX_SHIFT) |
  2417 + (segment << IGU_REGULAR_SEGMENT_ACCESS_SHIFT) |
  2418 + (update << IGU_REGULAR_BUPDATE_SHIFT) |
  2419 + (op << IGU_REGULAR_ENABLE_INT_SHIFT);
  2420 +
  2421 +
  2422 + CNIC_WR(dev, igu_addr, cmd_data.sb_id_and_flags);
  2423 +}
  2424 +
2409 2425 static void cnic_ack_bnx2x_msix(struct cnic_dev *dev)
2410 2426 {
2411 2427 struct cnic_local *cp = dev->cnic_priv;
... ... @@ -2414,6 +2430,14 @@
2414 2430 IGU_INT_DISABLE, 0);
2415 2431 }
2416 2432  
  2433 +static void cnic_ack_bnx2x_e2_msix(struct cnic_dev *dev)
  2434 +{
  2435 + struct cnic_local *cp = dev->cnic_priv;
  2436 +
  2437 + cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF, 0,
  2438 + IGU_INT_DISABLE, 0);
  2439 +}
  2440 +
2417 2441 static u32 cnic_service_bnx2x_kcq(struct cnic_dev *dev, struct kcq_info *info)
2418 2442 {
2419 2443 u32 last_status = *info->status_idx_ptr;
... ... @@ -2445,8 +2469,12 @@
2445 2469 status_idx = cnic_service_bnx2x_kcq(dev, &cp->kcq1);
2446 2470  
2447 2471 CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
2448   - cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
2449   - status_idx, IGU_INT_ENABLE, 1);
  2472 + if (BNX2X_CHIP_IS_E2(cp->chip_id))
  2473 + cnic_ack_igu_sb(dev, cp->bnx2x_igu_sb_id, IGU_SEG_ACCESS_DEF,
  2474 + status_idx, IGU_INT_ENABLE, 1);
  2475 + else
  2476 + cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
  2477 + status_idx, IGU_INT_ENABLE, 1);
2450 2478 }
2451 2479  
2452 2480 static int cnic_service_bnx2x(void *data, void *status_blk)
... ... @@ -4208,7 +4236,7 @@
4208 4236 static void cnic_get_bnx2x_iscsi_info(struct cnic_dev *dev)
4209 4237 {
4210 4238 struct cnic_local *cp = dev->cnic_priv;
4211   - u32 base, addr, val;
  4239 + u32 base, base2, addr, val;
4212 4240 int port = CNIC_PORT(cp);
4213 4241  
4214 4242 dev->max_iscsi_conn = 0;
... ... @@ -4216,6 +4244,8 @@
4216 4244 if (base == 0)
4217 4245 return;
4218 4246  
  4247 + base2 = CNIC_RD(dev, (CNIC_PATH(cp) ? MISC_REG_GENERIC_CR_1 :
  4248 + MISC_REG_GENERIC_CR_0));
4219 4249 addr = BNX2X_SHMEM_ADDR(base,
4220 4250 dev_info.port_hw_config[port].iscsi_mac_upper);
4221 4251  
4222 4252  
... ... @@ -4248,11 +4278,15 @@
4248 4278 val16 ^= 0x1e1e;
4249 4279 dev->max_iscsi_conn = val16;
4250 4280 }
4251   - if (BNX2X_CHIP_IS_E1H(cp->chip_id)) {
  4281 + if (BNX2X_CHIP_IS_E1H(cp->chip_id) || BNX2X_CHIP_IS_E2(cp->chip_id)) {
4252 4282 int func = CNIC_FUNC(cp);
4253 4283 u32 mf_cfg_addr;
4254 4284  
4255   - mf_cfg_addr = base + BNX2X_SHMEM_MF_BLK_OFFSET;
  4285 + if (BNX2X_SHMEM2_HAS(base2, mf_cfg_addr))
  4286 + mf_cfg_addr = CNIC_RD(dev, BNX2X_SHMEM2_ADDR(base2,
  4287 + mf_cfg_addr));
  4288 + else
  4289 + mf_cfg_addr = base + BNX2X_SHMEM_MF_BLK_OFFSET;
4256 4290  
4257 4291 addr = mf_cfg_addr +
4258 4292 offsetof(struct mf_cfg, func_mf_config[func].e1hov_tag);
4259 4293  
... ... @@ -4277,9 +4311,22 @@
4277 4311 struct cnic_eth_dev *ethdev = cp->ethdev;
4278 4312 int func = CNIC_FUNC(cp), ret, i;
4279 4313 u32 pfid;
4280   - struct host_hc_status_block_e1x *sb = cp->status_blk.gen;
4281 4314  
4282   - cp->pfid = func;
  4315 + if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
  4316 + u32 val = CNIC_RD(dev, MISC_REG_PORT4MODE_EN_OVWR);
  4317 +
  4318 + if (!(val & 1))
  4319 + val = CNIC_RD(dev, MISC_REG_PORT4MODE_EN);
  4320 + else
  4321 + val = (val >> 1) & 1;
  4322 +
  4323 + if (val)
  4324 + cp->pfid = func >> 1;
  4325 + else
  4326 + cp->pfid = func & 0x6;
  4327 + } else {
  4328 + cp->pfid = func;
  4329 + }
4283 4330 pfid = cp->pfid;
4284 4331  
4285 4332 ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ,
4286 4333  
... ... @@ -4294,11 +4341,22 @@
4294 4341 CSTORM_ISCSI_EQ_PROD_OFFSET(pfid, 0);
4295 4342 cp->kcq1.sw_prod_idx = 0;
4296 4343  
4297   - cp->kcq1.hw_prod_idx_ptr =
4298   - &sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS];
4299   - cp->kcq1.status_idx_ptr =
4300   - &sb->sb.running_index[SM_RX_ID];
  4344 + if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
  4345 + struct host_hc_status_block_e2 *sb = cp->status_blk.gen;
4301 4346  
  4347 + cp->kcq1.hw_prod_idx_ptr =
  4348 + &sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS];
  4349 + cp->kcq1.status_idx_ptr =
  4350 + &sb->sb.running_index[SM_RX_ID];
  4351 + } else {
  4352 + struct host_hc_status_block_e1x *sb = cp->status_blk.gen;
  4353 +
  4354 + cp->kcq1.hw_prod_idx_ptr =
  4355 + &sb->sb.index_values[HC_INDEX_ISCSI_EQ_CONS];
  4356 + cp->kcq1.status_idx_ptr =
  4357 + &sb->sb.running_index[SM_RX_ID];
  4358 + }
  4359 +
4302 4360 cnic_get_bnx2x_iscsi_info(dev);
4303 4361  
4304 4362 /* Only 1 EQ */
... ... @@ -4380,7 +4438,9 @@
4380 4438 cl_qzone_id = BNX2X_CL_QZONE_ID(cp, cli);
4381 4439  
4382 4440 off = BAR_USTRORM_INTMEM +
4383   - USTORM_RX_PRODS_E1X_OFFSET(CNIC_PORT(cp), cli);
  4441 + (BNX2X_CHIP_IS_E2(cp->chip_id) ?
  4442 + USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) :
  4443 + USTORM_RX_PRODS_E1X_OFFSET(CNIC_PORT(cp), cli));
4384 4444  
4385 4445 for (i = 0; i < sizeof(struct ustorm_eth_rx_producers) / 4; i++)
4386 4446 CNIC_WR(dev, off + i * 4, ((u32 *) &rx_prods)[i]);
... ... @@ -4506,7 +4566,6 @@
4506 4566 return -EALREADY;
4507 4567  
4508 4568 dev->regview = ethdev->io_base;
4509   - cp->chip_id = ethdev->chip_id;
4510 4569 pci_dev_get(dev->pcidev);
4511 4570 cp->func = PCI_FUNC(dev->pcidev->devfn);
4512 4571 cp->status_blk.gen = ethdev->irq_arr[0].status_blk;
... ... @@ -4683,6 +4742,7 @@
4683 4742 cp = cdev->cnic_priv;
4684 4743 cp->ethdev = ethdev;
4685 4744 cdev->pcidev = pdev;
  4745 + cp->chip_id = ethdev->chip_id;
4686 4746  
4687 4747 cp->cnic_ops = &cnic_bnx2_ops;
4688 4748 cp->start_hw = cnic_start_bnx2_hw;
... ... @@ -4737,6 +4797,7 @@
4737 4797 cp = cdev->cnic_priv;
4738 4798 cp->ethdev = ethdev;
4739 4799 cdev->pcidev = pdev;
  4800 + cp->chip_id = ethdev->chip_id;
4740 4801  
4741 4802 cp->cnic_ops = &cnic_bnx2x_ops;
4742 4803 cp->start_hw = cnic_start_bnx2x_hw;
... ... @@ -4748,7 +4809,10 @@
4748 4809 cp->stop_cm = cnic_cm_stop_bnx2x_hw;
4749 4810 cp->enable_int = cnic_enable_bnx2x_int;
4750 4811 cp->disable_int_sync = cnic_disable_bnx2x_int_sync;
4751   - cp->ack_int = cnic_ack_bnx2x_msix;
  4812 + if (BNX2X_CHIP_IS_E2(cp->chip_id))
  4813 + cp->ack_int = cnic_ack_bnx2x_e2_msix;
  4814 + else
  4815 + cp->ack_int = cnic_ack_bnx2x_msix;
4752 4816 cp->close_conn = cnic_close_bnx2x_conn;
4753 4817 cp->next_idx = cnic_bnx2x_next_idx;
4754 4818 cp->hw_idx = cnic_bnx2x_hw_idx;
... ... @@ -372,15 +372,35 @@
372 372 #define BNX2X_ISCSI_PBL_NOT_CACHED 0xff
373 373 #define BNX2X_ISCSI_PDU_HEADER_NOT_CACHED 0xff
374 374  
  375 +#define BNX2X_CHIP_NUM_57710 0x164e
375 376 #define BNX2X_CHIP_NUM_57711 0x164f
376 377 #define BNX2X_CHIP_NUM_57711E 0x1650
  378 +#define BNX2X_CHIP_NUM_57712 0x1662
  379 +#define BNX2X_CHIP_NUM_57712E 0x1663
  380 +#define BNX2X_CHIP_NUM_57713 0x1651
  381 +#define BNX2X_CHIP_NUM_57713E 0x1652
  382 +
377 383 #define BNX2X_CHIP_NUM(x) (x >> 16)
  384 +#define BNX2X_CHIP_IS_57710(x) \
  385 + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57710)
378 386 #define BNX2X_CHIP_IS_57711(x) \
379 387 (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711)
380 388 #define BNX2X_CHIP_IS_57711E(x) \
381 389 (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711E)
382 390 #define BNX2X_CHIP_IS_E1H(x) \
383 391 (BNX2X_CHIP_IS_57711(x) || BNX2X_CHIP_IS_57711E(x))
  392 +#define BNX2X_CHIP_IS_57712(x) \
  393 + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57712)
  394 +#define BNX2X_CHIP_IS_57712E(x) \
  395 + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57712E)
  396 +#define BNX2X_CHIP_IS_57713(x) \
  397 + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57713)
  398 +#define BNX2X_CHIP_IS_57713E(x) \
  399 + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57713E)
  400 +#define BNX2X_CHIP_IS_E2(x) \
  401 + (BNX2X_CHIP_IS_57712(x) || BNX2X_CHIP_IS_57712E(x) || \
  402 + BNX2X_CHIP_IS_57713(x) || BNX2X_CHIP_IS_57713E(x))
  403 +
384 404 #define IS_E1H_OFFSET BNX2X_CHIP_IS_E1H(cp->chip_id)
385 405  
386 406 #define BNX2X_RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct eth_rx_bd))
... ... @@ -409,6 +429,8 @@
409 429  
410 430 #define CNIC_PORT(cp) ((cp)->pfid & 1)
411 431 #define CNIC_FUNC(cp) ((cp)->func)
  432 +#define CNIC_PATH(cp) (!BNX2X_CHIP_IS_E2(cp->chip_id) ? 0 :\
  433 + (CNIC_FUNC(cp) & 1))
412 434 #define CNIC_E1HVN(cp) ((cp)->pfid >> 1)
413 435  
414 436 #define BNX2X_HW_CID(cp, x) ((CNIC_PORT(cp) << 23) | \
drivers/net/cnic_if.h
... ... @@ -12,8 +12,8 @@
12 12 #ifndef CNIC_IF_H
13 13 #define CNIC_IF_H
14 14  
15   -#define CNIC_MODULE_VERSION "2.2.5"
16   -#define CNIC_MODULE_RELDATE "September 29, 2010"
  15 +#define CNIC_MODULE_VERSION "2.2.6"
  16 +#define CNIC_MODULE_RELDATE "Oct 12, 2010"
17 17  
18 18 #define CNIC_ULP_RDMA 0
19 19 #define CNIC_ULP_ISCSI 1