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);
 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)
        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;
                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;
                        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);
 #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)
 {
                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);
 
 
  *     Check if the ARP request is probing the private IP address
  *     dedicated to iSCSI, generate an ARP reply if so.
  */
-static void cxgb3_arp_process(struct adapter *adapter, struct sk_buff *skb)
+static void cxgb3_arp_process(struct port_info *pi, struct sk_buff *skb)
 {
        struct net_device *dev = skb->dev;
-       struct port_info *pi;
        struct arphdr *arp;
        unsigned char *arp_ptr;
        unsigned char *sha;
        arp_ptr += dev->addr_len;
        memcpy(&tip, arp_ptr, sizeof(tip));
 
-       pi = netdev_priv(dev);
        if (tip != pi->iscsi_ipv4addr)
                return;
 
        arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
-                dev->dev_addr, sha);
+                pi->iscsic.mac_addr, sha);
 
 }
 
        return skb->protocol == htons(ETH_P_ARP);
 }
 
+static void cxgb3_process_iscsi_prov_pack(struct port_info *pi,
+                                       struct sk_buff *skb)
+{
+       if (is_arp(skb)) {
+               cxgb3_arp_process(pi, skb);
+               return;
+       }
+
+       if (pi->iscsic.recv)
+               pi->iscsic.recv(pi, skb);
+
+}
+
 /**
  *     rx_eth - process an ingress ethernet packet
  *     @adap: the adapter
                                vlan_gro_receive(&qs->napi, grp,
                                                 ntohs(p->vlan), skb);
                        else {
-                               if (unlikely(pi->iscsi_ipv4addr &&
-                                   is_arp(skb))) {
+                               if (unlikely(pi->iscsic.flags)) {
                                        unsigned short vtag = ntohs(p->vlan) &
                                                                VLAN_VID_MASK;
                                        skb->dev = vlan_group_get_device(grp,
                                                                         vtag);
-                                       cxgb3_arp_process(adap, skb);
+                                       cxgb3_process_iscsi_prov_pack(pi, skb);
                                }
                                __vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
                                                  rq->polling);
                if (lro)
                        napi_gro_receive(&qs->napi, skb);
                else {
-                       if (unlikely(pi->iscsi_ipv4addr && is_arp(skb)))
-                               cxgb3_arp_process(adap, skb);
+                       if (unlikely(pi->iscsic.flags))
+                               cxgb3_process_iscsi_prov_pack(pi, skb);
                        netif_receive_skb(skb);
                }
        } else