Commit a266161b authored by Margit Schubert-While's avatar Margit Schubert-While Committed by Linus Torvalds

[PATCH] prism54: Reset card on tx timeout

* islpci_eth.[c,h] islpci_dev.[c,h] : reset card on tx_timeout.
  Patch submited by Denis Vlasenko <vda@port.imtp.ilyichevsk.odessa.ua>
parent b483f757
...@@ -743,9 +743,11 @@ islpci_setup(struct pci_dev *pdev) ...@@ -743,9 +743,11 @@ islpci_setup(struct pci_dev *pdev)
/* initialize workqueue's */ /* initialize workqueue's */
INIT_WORK(&priv->stats_work, INIT_WORK(&priv->stats_work,
(void (*)(void *)) prism54_update_stats, priv); (void (*)(void *)) prism54_update_stats, priv);
priv->stats_timestamp = 0; priv->stats_timestamp = 0;
INIT_WORK(&priv->reset_task, islpci_do_reset_and_wake, priv);
priv->reset_task_pending = 0;
/* allocate various memory areas */ /* allocate various memory areas */
if (islpci_alloc_memory(priv)) if (islpci_alloc_memory(priv))
goto do_free_netdev; goto do_free_netdev;
......
...@@ -188,6 +188,9 @@ typedef struct { ...@@ -188,6 +188,9 @@ typedef struct {
struct list_head bss_wpa_list; struct list_head bss_wpa_list;
int num_bss_wpa; int num_bss_wpa;
struct semaphore wpa_sem; struct semaphore wpa_sem;
struct work_struct reset_task;
int reset_task_pending;
} islpci_private; } islpci_private;
static inline islpci_state_t static inline islpci_state_t
......
...@@ -319,17 +319,9 @@ islpci_eth_receive(islpci_private *priv) ...@@ -319,17 +319,9 @@ islpci_eth_receive(islpci_private *priv)
/* The card reports full 802.11 packets but with a 20 bytes /* The card reports full 802.11 packets but with a 20 bytes
* header and without the FCS. But there a is a bit that * header and without the FCS. But there a is a bit that
* indicates if the packet is corrupted :-) */ * indicates if the packet is corrupted :-) */
/* int i; */ if (skb->data[8] & 0x01)
if (skb->data[8] & 0x01){
/* This one is bad. Drop it !*/ /* This one is bad. Drop it !*/
discard = 1; discard = 1;
/* printk("BAD\n");*/
}
/*
for(i=0;i<50;i++)
printk("%2.2X:",skb->data[i]);
printk("\n");
*/
skb_pull(skb, 20); skb_pull(skb, 20);
skb->protocol = htons(ETH_P_802_2); skb->protocol = htons(ETH_P_802_2);
skb->mac.raw = skb->data; skb->mac.raw = skb->data;
...@@ -413,6 +405,15 @@ islpci_eth_receive(islpci_private *priv) ...@@ -413,6 +405,15 @@ islpci_eth_receive(islpci_private *priv)
return 0; return 0;
} }
void
islpci_do_reset_and_wake(void *data)
{
islpci_private *priv = (islpci_private *) data;
islpci_reset(priv, 1);
netif_wake_queue(priv->ndev);
priv->reset_task_pending = 0;
}
void void
islpci_eth_tx_timeout(struct net_device *ndev) islpci_eth_tx_timeout(struct net_device *ndev)
{ {
...@@ -422,13 +423,11 @@ islpci_eth_tx_timeout(struct net_device *ndev) ...@@ -422,13 +423,11 @@ islpci_eth_tx_timeout(struct net_device *ndev)
/* increment the transmit error counter */ /* increment the transmit error counter */
statistics->tx_errors++; statistics->tx_errors++;
#if 0 if(!priv->reset_task_pending) {
/* don't do this here! we are not allowed to sleep since we are in interrupt context */ priv->reset_task_pending = 1;
if (islpci_reset(priv)) netif_stop_queue(ndev);
printk(KERN_ERR "%s: error on TX timeout card reset!\n", schedule_work(&priv->reset_task);
ndev->name); }
#endif
/* netif_wake_queue(ndev); */
return; return;
} }
...@@ -27,5 +27,6 @@ void islpci_eth_cleanup_transmit(islpci_private *, isl38xx_control_block *); ...@@ -27,5 +27,6 @@ void islpci_eth_cleanup_transmit(islpci_private *, isl38xx_control_block *);
int islpci_eth_transmit(struct sk_buff *, struct net_device *); int islpci_eth_transmit(struct sk_buff *, struct net_device *);
int islpci_eth_receive(islpci_private *); int islpci_eth_receive(islpci_private *);
void islpci_eth_tx_timeout(struct net_device *); void islpci_eth_tx_timeout(struct net_device *);
void islpci_do_reset_and_wake(void *data);
#endif /* _ISL_GEN_H */ #endif /* _ISL_GEN_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment