cxgb3: Notify fatal errors
Set up a notification mechanism to inform upper layer modules (iWARP, iSCSI) of a chip reset due to an EEH event or a fatal error. Signed-off-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1373c0fdbc
commit
cb0bc20595
@ -2542,6 +2542,12 @@ static int t3_adapter_error(struct adapter *adapter, int reset)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
if (is_offload(adapter) &&
|
||||
test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) {
|
||||
cxgb3_err_notify(&adapter->tdev, OFFLOAD_STATUS_DOWN, 0);
|
||||
offload_close(&adapter->tdev);
|
||||
}
|
||||
|
||||
/* Stop all ports */
|
||||
for_each_port(adapter, i) {
|
||||
struct net_device *netdev = adapter->port[i];
|
||||
@ -2550,10 +2556,6 @@ static int t3_adapter_error(struct adapter *adapter, int reset)
|
||||
cxgb_close(netdev);
|
||||
}
|
||||
|
||||
if (is_offload(adapter) &&
|
||||
test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map))
|
||||
offload_close(&adapter->tdev);
|
||||
|
||||
/* Stop SGE timers */
|
||||
t3_stop_sge_timers(adapter);
|
||||
|
||||
@ -2605,6 +2607,9 @@ static void t3_resume_ports(struct adapter *adapter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (is_offload(adapter) && !ofld_disable)
|
||||
cxgb3_err_notify(&adapter->tdev, OFFLOAD_STATUS_UP, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -153,6 +153,18 @@ void cxgb3_remove_clients(struct t3cdev *tdev)
|
||||
mutex_unlock(&cxgb3_db_lock);
|
||||
}
|
||||
|
||||
void cxgb3_err_notify(struct t3cdev *tdev, u32 status, u32 error)
|
||||
{
|
||||
struct cxgb3_client *client;
|
||||
|
||||
mutex_lock(&cxgb3_db_lock);
|
||||
list_for_each_entry(client, &client_list, client_list) {
|
||||
if (client->err_handler)
|
||||
client->err_handler(tdev, status, error);
|
||||
}
|
||||
mutex_unlock(&cxgb3_db_lock);
|
||||
}
|
||||
|
||||
static struct net_device *get_iff_from_mac(struct adapter *adapter,
|
||||
const unsigned char *mac,
|
||||
unsigned int vlan)
|
||||
|
@ -64,10 +64,16 @@ void cxgb3_register_client(struct cxgb3_client *client);
|
||||
void cxgb3_unregister_client(struct cxgb3_client *client);
|
||||
void cxgb3_add_clients(struct t3cdev *tdev);
|
||||
void cxgb3_remove_clients(struct t3cdev *tdev);
|
||||
void cxgb3_err_notify(struct t3cdev *tdev, u32 status, u32 error);
|
||||
|
||||
typedef int (*cxgb3_cpl_handler_func)(struct t3cdev *dev,
|
||||
struct sk_buff *skb, void *ctx);
|
||||
|
||||
enum {
|
||||
OFFLOAD_STATUS_UP,
|
||||
OFFLOAD_STATUS_DOWN
|
||||
};
|
||||
|
||||
struct cxgb3_client {
|
||||
char *name;
|
||||
void (*add) (struct t3cdev *);
|
||||
@ -76,6 +82,7 @@ struct cxgb3_client {
|
||||
int (*redirect)(void *ctx, struct dst_entry *old,
|
||||
struct dst_entry *new, struct l2t_entry *l2t);
|
||||
struct list_head client_list;
|
||||
void (*err_handler)(struct t3cdev *tdev, u32 status, u32 error);
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user