Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[sfrench/cifs-2.6.git] / drivers / net / cxgb3 / sge.c
index 6366061712f447c198b31e5c5307ede58de51c06..49f3de79118ce397ddb37025e156791ca4e3b8bb 100644 (file)
@@ -1260,7 +1260,7 @@ netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
                if (should_restart_tx(q) &&
                    test_and_clear_bit(TXQ_ETH, &qs->txq_stopped)) {
                        q->restarts++;
-                       netif_tx_wake_queue(txq);
+                       netif_tx_start_queue(txq);
                }
        }
 
@@ -1946,10 +1946,9 @@ static void restart_tx(struct sge_qset *qs)
  *     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;
@@ -1972,12 +1971,11 @@ static void cxgb3_arp_process(struct adapter *adapter, struct sk_buff *skb)
        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);
 
 }
 
@@ -1986,6 +1984,19 @@ static inline int is_arp(struct sk_buff *skb)
        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
@@ -2024,13 +2035,12 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
                                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);
@@ -2041,8 +2051,8 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
                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
@@ -2125,6 +2135,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
        if (!complete)
                return;
 
+       skb_record_rx_queue(skb, qs - &adap->sge.qs[0]);
        skb->ip_summed = CHECKSUM_UNNECESSARY;
        cpl = qs->lro_va;