]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/libertas/rx.c
iwlwifi: rename 4965 to AGN
[linux-2.6] / drivers / net / wireless / libertas / rx.c
index 90a21996e82338d7b3251a49e087176cedae412f..5749f22b296f90969b6580df2ae505629892762d 100644 (file)
@@ -131,22 +131,6 @@ static void lbs_compute_rssi(struct lbs_private *priv, struct rxpd *p_rx_pd)
        lbs_deb_leave(LBS_DEB_RX);
 }
 
-void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
-{
-       lbs_deb_rx("skb->data %p\n", skb->data);
-
-       if (priv->monitormode != LBS_MONITOR_OFF) {
-               skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);
-       } else {
-               if (priv->mesh_dev && IS_MESH_FRAME(skb))
-                       skb->protocol = eth_type_trans(skb, priv->mesh_dev);
-               else
-                       skb->protocol = eth_type_trans(skb, priv->dev);
-       }
-       skb->ip_summed = CHECKSUM_NONE;
-       netif_rx(skb);
-}
-
 /**
  *  @brief This function processes received packet and forwards it
  *  to kernel/upper layer
@@ -158,26 +142,26 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
 int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
 {
        int ret = 0;
-
+       struct net_device *dev = priv->dev;
        struct rxpackethdr *p_rx_pkt;
        struct rxpd *p_rx_pd;
-
        int hdrchop;
        struct ethhdr *p_ethhdr;
-
        const u8 rfc1042_eth_hdr[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
 
        lbs_deb_enter(LBS_DEB_RX);
 
-       if (priv->monitormode != LBS_MONITOR_OFF)
+       BUG_ON(!skb);
+
+       skb->ip_summed = CHECKSUM_NONE;
+
+       if (priv->monitormode)
                return process_rxed_802_11_packet(priv, skb);
 
        p_rx_pkt = (struct rxpackethdr *) skb->data;
        p_rx_pd = &p_rx_pkt->rx_pd;
-       if (p_rx_pd->rx_control & RxPD_MESH_FRAME)
-               SET_MESH_FRAME(skb);
-       else
-               UNSET_MESH_FRAME(skb);
+       if (priv->mesh_dev && (p_rx_pd->rx_control & RxPD_MESH_FRAME))
+               dev = priv->mesh_dev;
 
        lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data,
                 min_t(unsigned int, skb->len, 100));
@@ -253,7 +237,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
        /* Take the data rate from the rxpd structure
         * only if the rate is auto
         */
-       if (priv->auto_rate)
+       if (priv->enablehwauto)
                priv->cur_rate = lbs_fw_index_to_data_rate(p_rx_pd->rx_rate);
 
        lbs_compute_rssi(priv, p_rx_pd);
@@ -262,7 +246,11 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
        priv->stats.rx_bytes += skb->len;
        priv->stats.rx_packets++;
 
-       lbs_upload_rx_packet(priv, skb);
+       skb->protocol = eth_type_trans(skb, dev);
+       if (in_interrupt())
+               netif_rx(skb);
+       else
+               netif_rx_ni(skb);
 
        ret = 0;
 done:
@@ -337,9 +325,10 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
        // lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data, min(skb->len, 100));
 
        if (skb->len < (ETH_HLEN + 8 + sizeof(struct rxpd))) {
-               lbs_deb_rx("rx err: frame received wit bad length\n");
+               lbs_deb_rx("rx err: frame received with bad length\n");
                priv->stats.rx_length_errors++;
-               ret = 0;
+               ret = -EINVAL;
+               kfree(skb);
                goto done;
        }
 
@@ -381,10 +370,11 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
 
        /* add space for the new radio header */
        if ((skb_headroom(skb) < sizeof(struct rx_radiotap_hdr)) &&
-           pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0,
-                            GFP_ATOMIC)) {
-               lbs_pr_alert("%s: couldn't pskb_expand_head\n",
-                            __func__);
+           pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0, GFP_ATOMIC)) {
+               lbs_pr_alert("%s: couldn't pskb_expand_head\n", __func__);
+               ret = -ENOMEM;
+               kfree_skb(skb);
+               goto done;
        }
 
        pradiotap_hdr = (void *)skb_push(skb, sizeof(struct rx_radiotap_hdr));
@@ -393,7 +383,7 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
        /* Take the data rate from the rxpd structure
         * only if the rate is auto
         */
-       if (priv->auto_rate)
+       if (priv->enablehwauto)
                priv->cur_rate = lbs_fw_index_to_data_rate(prxpd->rx_rate);
 
        lbs_compute_rssi(priv, prxpd);
@@ -402,7 +392,8 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
        priv->stats.rx_bytes += skb->len;
        priv->stats.rx_packets++;
 
-       lbs_upload_rx_packet(priv, skb);
+       skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);
+       netif_rx(skb);
 
        ret = 0;