Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze
[cascardo/linux.git] / drivers / net / ethernet / broadcom / cnic.c
index ac08b8e..cc8434f 100644 (file)
@@ -1288,7 +1288,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
        if (ret)
                goto error;
 
-       if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
+       if (CNIC_SUPPORTS_FCOE(cp)) {
                ret = cnic_alloc_kcq(dev, &cp->kcq2, true);
                if (ret)
                        goto error;
@@ -1303,6 +1303,9 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
        if (ret)
                goto error;
 
+       if (cp->ethdev->drv_state & CNIC_DRV_STATE_NO_ISCSI)
+               return 0;
+
        cp->bnx2x_def_status_blk = cp->ethdev->irq_arr[1].status_blk;
 
        cp->l2_rx_ring_size = 15;
@@ -3130,7 +3133,7 @@ static void cnic_service_bnx2x_bh(unsigned long data)
                CNIC_WR16(dev, cp->kcq1.io_addr,
                          cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
 
-               if (!BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
+               if (cp->ethdev->drv_state & CNIC_DRV_STATE_NO_FCOE) {
                        cp->arm_int(dev, status_idx);
                        break;
                }
@@ -4888,6 +4891,9 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,
        buf_map = udev->l2_buf_map;
        for (i = 0; i < MAX_TX_DESC_CNT; i += 3, txbd += 3) {
                struct eth_tx_start_bd *start_bd = &txbd->start_bd;
+               struct eth_tx_parse_bd_e1x *pbd_e1x =
+                       &((txbd + 1)->parse_bd_e1x);
+               struct eth_tx_parse_bd_e2 *pbd_e2 = &((txbd + 1)->parse_bd_e2);
                struct eth_tx_bd *reg_bd = &((txbd + 2)->reg_bd);
 
                start_bd->addr_hi = cpu_to_le32((u64) buf_map >> 32);
@@ -4897,10 +4903,15 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,
                start_bd->nbytes = cpu_to_le16(0x10);
                start_bd->nbd = cpu_to_le16(3);
                start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD;
-               start_bd->general_data = (UNICAST_ADDRESS <<
-                       ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT);
+               start_bd->general_data &= ~ETH_TX_START_BD_PARSE_NBDS;
                start_bd->general_data |= (1 << ETH_TX_START_BD_HDR_NBDS_SHIFT);
 
+               if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id))
+                       pbd_e2->parsing_data = (UNICAST_ADDRESS <<
+                                ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE_SHIFT);
+               else
+                        pbd_e1x->global_data = (UNICAST_ADDRESS <<
+                               ETH_TX_PARSE_BD_E1X_ETH_ADDR_TYPE_SHIFT);
        }
 
        val = (u64) ring_map >> 32;
@@ -5351,7 +5362,7 @@ static void cnic_stop_hw(struct cnic_dev *dev)
                /* Need to wait for the ring shutdown event to complete
                 * before clearing the CNIC_UP flag.
                 */
-               while (cp->udev->uio_dev != -1 && i < 15) {
+               while (cp->udev && cp->udev->uio_dev != -1 && i < 15) {
                        msleep(100);
                        i++;
                }
@@ -5516,8 +5527,7 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)
 
        if (!(ethdev->drv_state & CNIC_DRV_STATE_NO_ISCSI))
                cdev->max_iscsi_conn = ethdev->max_iscsi_conn;
-       if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) &&
-           !(ethdev->drv_state & CNIC_DRV_STATE_NO_FCOE))
+       if (CNIC_SUPPORTS_FCOE(cp))
                cdev->max_fcoe_conn = ethdev->max_fcoe_conn;
 
        if (cdev->max_fcoe_conn > BNX2X_FCOE_NUM_CONNECTIONS)