cxgb3: Added private MAC address and provisioning packet handler for iSCSI
[linux-block.git] / drivers / net / cxgb3 / cxgb3_main.c
index 34e776c5f06b4391e1a7bf42ff1cffb72c8b9ce7..c9113d3297eeffc71b60ad7650b8e446525648e9 100644 (file)
@@ -344,8 +344,10 @@ static void link_start(struct net_device *dev)
 
        init_rx_mode(&rm, dev, dev->mc_list);
        t3_mac_reset(mac);
+       t3_mac_set_num_ucast(mac, MAX_MAC_IDX);
        t3_mac_set_mtu(mac, dev->mtu);
-       t3_mac_set_address(mac, 0, dev->dev_addr);
+       t3_mac_set_address(mac, LAN_MAC_IDX, dev->dev_addr);
+       t3_mac_set_address(mac, SAN_MAC_IDX, pi->iscsic.mac_addr);
        t3_mac_set_rx_mode(mac, &rm);
        t3_link_start(&pi->phy, mac, &pi->link_config);
        t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
@@ -903,6 +905,7 @@ static inline int offload_tx(struct t3cdev *tdev, struct sk_buff *skb)
 static int write_smt_entry(struct adapter *adapter, int idx)
 {
        struct cpl_smt_write_req *req;
+       struct port_info *pi = netdev_priv(adapter->port[idx]);
        struct sk_buff *skb = alloc_skb(sizeof(*req), GFP_KERNEL);
 
        if (!skb)
@@ -913,8 +916,8 @@ static int write_smt_entry(struct adapter *adapter, int idx)
        OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx));
        req->mtu_idx = NMTUS - 1;       /* should be 0 but there's a T3 bug */
        req->iff = idx;
-       memset(req->src_mac1, 0, sizeof(req->src_mac1));
        memcpy(req->src_mac0, adapter->port[idx]->dev_addr, ETH_ALEN);
+       memcpy(req->src_mac1, pi->iscsic.mac_addr, ETH_ALEN);
        skb->priority = 1;
        offload_tx(&adapter->tdev, skb);
        return 0;
@@ -2516,7 +2519,7 @@ static int cxgb_set_mac_addr(struct net_device *dev, void *p)
                return -EINVAL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
-       t3_mac_set_address(&pi->mac, 0, dev->dev_addr);
+       t3_mac_set_address(&pi->mac, LAN_MAC_IDX, dev->dev_addr);
        if (offload_running(adapter))
                write_smt_entry(adapter, pi->port_id);
        return 0;
@@ -2654,7 +2657,7 @@ static void check_t3b2_mac(struct adapter *adapter)
                        struct cmac *mac = &p->mac;
 
                        t3_mac_set_mtu(mac, dev->mtu);
-                       t3_mac_set_address(mac, 0, dev->dev_addr);
+                       t3_mac_set_address(mac, LAN_MAC_IDX, dev->dev_addr);
                        cxgb_set_rxmode(dev);
                        t3_link_start(&p->phy, mac, &p->link_config);
                        t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
@@ -3112,6 +3115,14 @@ static const struct net_device_ops cxgb_netdev_ops = {
 #endif
 };
 
+static void __devinit cxgb3_init_iscsi_mac(struct net_device *dev)
+{
+       struct port_info *pi = netdev_priv(dev);
+
+       memcpy(pi->iscsic.mac_addr, dev->dev_addr, ETH_ALEN);
+       pi->iscsic.mac_addr[3] |= 0x80;
+}
+
 static int __devinit init_one(struct pci_dev *pdev,
                              const struct pci_device_id *ent)
 {
@@ -3270,6 +3281,9 @@ static int __devinit init_one(struct pci_dev *pdev,
                goto out_free_dev;
        }
 
+       for_each_port(adapter, i)
+               cxgb3_init_iscsi_mac(adapter->port[i]);
+
        /* Driver's ready. Reflect it on LEDs */
        t3_led_ready(adapter);