|
@@ -437,6 +437,31 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter)
|
|
&adapter->rx_buff_pool[i]);
|
|
&adapter->rx_buff_pool[i]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int ibmveth_register_logical_lan(struct ibmveth_adapter *adapter,
|
|
|
|
+ union ibmveth_buf_desc rxq_desc, u64 mac_address)
|
|
|
|
+{
|
|
|
|
+ int rc, try_again = 1;
|
|
|
|
+
|
|
|
|
+ /* After a kexec the adapter will still be open, so our attempt to
|
|
|
|
+ * open it will fail. So if we get a failure we free the adapter and
|
|
|
|
+ * try again, but only once. */
|
|
|
|
+retry:
|
|
|
|
+ rc = h_register_logical_lan(adapter->vdev->unit_address,
|
|
|
|
+ adapter->buffer_list_dma, rxq_desc.desc,
|
|
|
|
+ adapter->filter_list_dma, mac_address);
|
|
|
|
+
|
|
|
|
+ if (rc != H_SUCCESS && try_again) {
|
|
|
|
+ do {
|
|
|
|
+ rc = h_free_logical_lan(adapter->vdev->unit_address);
|
|
|
|
+ } while (H_IS_LONG_BUSY(rc) || (rc == H_BUSY));
|
|
|
|
+
|
|
|
|
+ try_again = 0;
|
|
|
|
+ goto retry;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ibmveth_open(struct net_device *netdev)
|
|
static int ibmveth_open(struct net_device *netdev)
|
|
{
|
|
{
|
|
struct ibmveth_adapter *adapter = netdev->priv;
|
|
struct ibmveth_adapter *adapter = netdev->priv;
|
|
@@ -502,12 +527,7 @@ static int ibmveth_open(struct net_device *netdev)
|
|
ibmveth_debug_printk("filter list @ 0x%p\n", adapter->filter_list_addr);
|
|
ibmveth_debug_printk("filter list @ 0x%p\n", adapter->filter_list_addr);
|
|
ibmveth_debug_printk("receive q @ 0x%p\n", adapter->rx_queue.queue_addr);
|
|
ibmveth_debug_printk("receive q @ 0x%p\n", adapter->rx_queue.queue_addr);
|
|
|
|
|
|
-
|
|
|
|
- lpar_rc = h_register_logical_lan(adapter->vdev->unit_address,
|
|
|
|
- adapter->buffer_list_dma,
|
|
|
|
- rxq_desc.desc,
|
|
|
|
- adapter->filter_list_dma,
|
|
|
|
- mac_address);
|
|
|
|
|
|
+ lpar_rc = ibmveth_register_logical_lan(adapter, rxq_desc, mac_address);
|
|
|
|
|
|
if(lpar_rc != H_SUCCESS) {
|
|
if(lpar_rc != H_SUCCESS) {
|
|
ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc);
|
|
ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc);
|