]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/cnic.c
Merge git://git.infradead.org/mtd-2.6
[mv-sheeva.git] / drivers / net / cnic.c
index 4a9c628ab2a64b16fb009533dcf73c51a77a1da5..263a2944566f6948f759f029a875d6f4eb01e3ce 100644 (file)
@@ -426,19 +426,6 @@ static int cnic_abort_prep(struct cnic_sock *csk)
        return 0;
 }
 
-static void cnic_uio_stop(void)
-{
-       struct cnic_dev *dev;
-
-       read_lock(&cnic_dev_lock);
-       list_for_each_entry(dev, &cnic_dev_list, list) {
-               struct cnic_local *cp = dev->cnic_priv;
-
-               cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
-       }
-       read_unlock(&cnic_dev_lock);
-}
-
 int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops)
 {
        struct cnic_dev *dev;
@@ -510,9 +497,6 @@ int cnic_unregister_driver(int ulp_type)
        }
        read_unlock(&cnic_dev_lock);
 
-       if (ulp_type == CNIC_ULP_ISCSI)
-               cnic_uio_stop();
-
        rcu_assign_pointer(cnic_ulp_tbl[ulp_type], NULL);
 
        mutex_unlock(&cnic_lock);
@@ -596,6 +580,9 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
        }
        mutex_unlock(&cnic_lock);
 
+       if (ulp_type == CNIC_ULP_ISCSI)
+               cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
+
        synchronize_rcu();
 
        while (test_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[ulp_type]) &&
@@ -964,7 +951,7 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)
                                           &udev->l2_ring_map,
                                           GFP_KERNEL | __GFP_COMP);
        if (!udev->l2_ring)
-               return -ENOMEM;
+               goto err_udev;
 
        udev->l2_buf_size = (cp->l2_rx_ring_size + 1) * cp->l2_single_buf_size;
        udev->l2_buf_size = PAGE_ALIGN(udev->l2_buf_size);
@@ -972,7 +959,7 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)
                                          &udev->l2_buf_map,
                                          GFP_KERNEL | __GFP_COMP);
        if (!udev->l2_buf)
-               return -ENOMEM;
+               goto err_dma;
 
        write_lock(&cnic_dev_lock);
        list_add(&udev->list, &cnic_udev_list);
@@ -983,6 +970,12 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)
        cp->udev = udev;
 
        return 0;
+ err_dma:
+       dma_free_coherent(&udev->pdev->dev, udev->l2_ring_size,
+                         udev->l2_ring, udev->l2_ring_map);
+ err_udev:
+       kfree(udev);
+       return -ENOMEM;
 }
 
 static int cnic_init_uio(struct cnic_dev *dev)
@@ -1297,12 +1290,18 @@ static int cnic_submit_kwqe_16(struct cnic_dev *dev, u32 cmd, u32 cid,
        struct cnic_local *cp = dev->cnic_priv;
        struct l5cm_spe kwqe;
        struct kwqe_16 *kwq[1];
+       u16 type_16;
        int ret;
 
        kwqe.hdr.conn_and_cmd_data =
                cpu_to_le32(((cmd << SPE_HDR_CMD_ID_SHIFT) |
                             BNX2X_HW_CID(cp, cid)));
-       kwqe.hdr.type = cpu_to_le16(type);
+
+       type_16 = (type << SPE_HDR_CONN_TYPE_SHIFT) & SPE_HDR_CONN_TYPE;
+       type_16 |= (cp->pfid << SPE_HDR_FUNCTION_ID_SHIFT) &
+                  SPE_HDR_FUNCTION_ID;
+
+       kwqe.hdr.type = cpu_to_le16(type_16);
        kwqe.hdr.reserved1 = 0;
        kwqe.data.phy_address.lo = cpu_to_le32(l5_data->phy_address.lo);
        kwqe.data.phy_address.hi = cpu_to_le32(l5_data->phy_address.hi);
@@ -1826,19 +1825,15 @@ static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid)
        struct cnic_context *ctx = &cp->ctx_tbl[l5_cid];
        union l5cm_specific_data l5_data;
        int ret;
-       u32 hw_cid, type;
+       u32 hw_cid;
 
        init_waitqueue_head(&ctx->waitq);
        ctx->wait_cond = 0;
        memset(&l5_data, 0, sizeof(l5_data));
        hw_cid = BNX2X_HW_CID(cp, ctx->cid);
-       type = (NONE_CONNECTION_TYPE << SPE_HDR_CONN_TYPE_SHIFT)
-               & SPE_HDR_CONN_TYPE;
-       type |= ((cp->pfid << SPE_HDR_FUNCTION_ID_SHIFT) &
-                SPE_HDR_FUNCTION_ID);
 
        ret = cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_COMMON_CFC_DEL,
-                                 hw_cid, type, &l5_data);
+                                 hw_cid, NONE_CONNECTION_TYPE, &l5_data);
 
        if (ret == 0)
                wait_event(ctx->waitq, ctx->wait_cond);
@@ -2211,7 +2206,6 @@ static int cnic_bnx2x_fcoe_init1(struct cnic_dev *dev, struct kwqe *wqes[],
        cp->kcq2.sw_prod_idx = 0;
 
        cid = BNX2X_HW_CID(cp, cp->fcoe_init_cid);
-       printk(KERN_ERR "bdbg: submitting INIT RAMROD \n");
        ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_INIT, cid,
                                  FCOE_CONNECTION_TYPE, &l5_data);
        *work = 3;
@@ -4826,12 +4820,8 @@ static void cnic_get_bnx2x_iscsi_info(struct cnic_dev *dev)
                val = CNIC_RD(dev, addr);
                val &= FUNC_MF_CFG_E1HOV_TAG_MASK;
                if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) {
-                       addr = BNX2X_MF_CFG_ADDR(mf_cfg_addr,
-                               func_mf_config[func].config);
-                       val = CNIC_RD(dev, addr);
-                       val &= FUNC_MF_CFG_PROTOCOL_MASK;
-                       if (val != FUNC_MF_CFG_PROTOCOL_ISCSI)
-                               dev->max_iscsi_conn = 0;
+                       dev->max_fcoe_conn = 0;
+                       dev->max_iscsi_conn = 0;
                }
        }
        if (!is_valid_ether_addr(dev->mac_addr))
@@ -4988,7 +4978,7 @@ static void cnic_init_rings(struct cnic_dev *dev)
        } else if (test_bit(CNIC_F_BNX2X_CLASS, &dev->flags)) {
                u32 cli = cp->ethdev->iscsi_l2_client_id;
                u32 cid = cp->ethdev->iscsi_l2_cid;
-               u32 cl_qzone_id, type;
+               u32 cl_qzone_id;
                struct client_init_ramrod_data *data;
                union l5cm_specific_data l5_data;
                struct ustorm_eth_rx_producers rx_prods = {0};
@@ -5020,15 +5010,10 @@ static void cnic_init_rings(struct cnic_dev *dev)
                l5_data.phy_address.lo = udev->l2_buf_map & 0xffffffff;
                l5_data.phy_address.hi = (u64) udev->l2_buf_map >> 32;
 
-               type = (ETH_CONNECTION_TYPE << SPE_HDR_CONN_TYPE_SHIFT)
-                       & SPE_HDR_CONN_TYPE;
-               type |= ((cp->pfid << SPE_HDR_FUNCTION_ID_SHIFT) &
-                       SPE_HDR_FUNCTION_ID);
-
                set_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags);
 
                cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_ETH_CLIENT_SETUP,
-                       cid, type, &l5_data);
+                       cid, ETH_CONNECTION_TYPE, &l5_data);
 
                i = 0;
                while (test_bit(CNIC_LCL_FL_L2_WAIT, &cp->cnic_local_flags) &&
@@ -5058,7 +5043,6 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)
                u32 cid = cp->ethdev->iscsi_l2_cid;
                union l5cm_specific_data l5_data;
                int i;
-               u32 type;
 
                cnic_ring_ctl(dev, cid, cli, 0);
 
@@ -5079,12 +5063,8 @@ static void cnic_shutdown_rings(struct cnic_dev *dev)
                cnic_spq_completion(dev, DRV_CTL_RET_L2_SPQ_CREDIT_CMD, 1);
 
                memset(&l5_data, 0, sizeof(l5_data));
-               type = (NONE_CONNECTION_TYPE << SPE_HDR_CONN_TYPE_SHIFT)
-                       & SPE_HDR_CONN_TYPE;
-               type |= ((cp->pfid << SPE_HDR_FUNCTION_ID_SHIFT) &
-                        SPE_HDR_FUNCTION_ID);
                cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_COMMON_CFC_DEL,
-                       cid, type, &l5_data);
+                       cid, NONE_CONNECTION_TYPE, &l5_data);
                msleep(10);
        }
        clear_bit(CNIC_LCL_FL_RINGS_INITED, &cp->cnic_local_flags);