Commit b97e2088 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Handle longbusy return codes in IBM VETH driver

From: Santiago Leon <santil@us.ibm.com>

Handle longbusy return codes in IBM VETH driver
parent 927078c6
...@@ -527,7 +527,10 @@ static int ibmveth_open(struct net_device *netdev) ...@@ -527,7 +527,10 @@ static int ibmveth_open(struct net_device *netdev)
ibmveth_debug_printk("registering irq 0x%x\n", netdev->irq); ibmveth_debug_printk("registering irq 0x%x\n", netdev->irq);
if((rc = request_irq(netdev->irq, &ibmveth_interrupt, 0, netdev->name, netdev)) != 0) { if((rc = request_irq(netdev->irq, &ibmveth_interrupt, 0, netdev->name, netdev)) != 0) {
ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc); ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc);
h_free_logical_lan(adapter->vdev->unit_address); do {
rc = h_free_logical_lan(adapter->vdev->unit_address);
} while H_isLongBusy(rc);
ibmveth_cleanup(adapter); ibmveth_cleanup(adapter);
return rc; return rc;
} }
...@@ -556,7 +559,9 @@ static int ibmveth_close(struct net_device *netdev) ...@@ -556,7 +559,9 @@ static int ibmveth_close(struct net_device *netdev)
cancel_delayed_work(&adapter->replenish_task); cancel_delayed_work(&adapter->replenish_task);
flush_scheduled_work(); flush_scheduled_work();
lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); do {
lpar_rc = h_free_logical_lan(adapter->vdev->unit_address);
} while H_isLongBusy(lpar_rc);
if(lpar_rc != H_Success) if(lpar_rc != H_Success)
{ {
...@@ -617,6 +622,8 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -617,6 +622,8 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
union ibmveth_buf_desc desc[IbmVethMaxSendFrags]; union ibmveth_buf_desc desc[IbmVethMaxSendFrags];
unsigned long lpar_rc; unsigned long lpar_rc;
int nfrags = 0, curfrag; int nfrags = 0, curfrag;
unsigned long correlator;
unsigned int retry_count;
if ((skb_shinfo(skb)->nr_frags + 1) > IbmVethMaxSendFrags) { if ((skb_shinfo(skb)->nr_frags + 1) > IbmVethMaxSendFrags) {
adapter->stats.tx_dropped++; adapter->stats.tx_dropped++;
...@@ -674,8 +681,8 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -674,8 +681,8 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
} }
/* send the frame. Arbitrarily set retrycount to 1024 */ /* send the frame. Arbitrarily set retrycount to 1024 */
unsigned long correlator = 0; correlator = 0;
unsigned int retry_count = 1024; retry_count = 1024;
do { do {
lpar_rc = h_send_logical_lan(adapter->vdev->unit_address, lpar_rc = h_send_logical_lan(adapter->vdev->unit_address,
desc[0].desc, desc[0].desc,
......
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