aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/cxgb3i
diff options
context:
space:
mode:
authorKaren Xie <kxie@chelsio.com>2009-04-01 14:11:23 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-04-03 10:23:11 -0400
commit515f1c885af2ba8a9500c8a7aa4ed16bbbfa3ef4 (patch)
tree5d6833dc4f2ecc26a72fd72f560286cc847a74a9 /drivers/scsi/cxgb3i
parentd8e965076514dcb16410c0d18c6c8de4dcba19fc (diff)
[SCSI] cxgb3i: subscribe to error notification from cxgb3 driver
Add error notification handling function which is called during chip reset. Signed-off-by: Karen Xie <kxie@chelsio.com> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/cxgb3i')
-rw-r--r--drivers/scsi/cxgb3i/cxgb3i.h10
-rw-r--r--drivers/scsi/cxgb3i/cxgb3i_init.c25
-rw-r--r--drivers/scsi/cxgb3i/cxgb3i_iscsi.c27
3 files changed, 52 insertions, 10 deletions
diff --git a/drivers/scsi/cxgb3i/cxgb3i.h b/drivers/scsi/cxgb3i/cxgb3i.h
index a7cf550b9cca..0942227aa7ba 100644
--- a/drivers/scsi/cxgb3i/cxgb3i.h
+++ b/drivers/scsi/cxgb3i/cxgb3i.h
@@ -66,10 +66,12 @@ struct cxgb3i_hba {
66 * @pdev: pointer to pci dev 66 * @pdev: pointer to pci dev
67 * @hba_cnt: # of hbas (the same as # of ports) 67 * @hba_cnt: # of hbas (the same as # of ports)
68 * @hba: all the hbas on this adapter 68 * @hba: all the hbas on this adapter
69 * @flags: bit flag for adapter event/status
69 * @tx_max_size: max. tx packet size supported 70 * @tx_max_size: max. tx packet size supported
70 * @rx_max_size: max. rx packet size supported 71 * @rx_max_size: max. rx packet size supported
71 * @tag_format: ddp tag format settings 72 * @tag_format: ddp tag format settings
72 */ 73 */
74#define CXGB3I_ADAPTER_FLAG_RESET 0x1
73struct cxgb3i_adapter { 75struct cxgb3i_adapter {
74 struct list_head list_head; 76 struct list_head list_head;
75 spinlock_t lock; 77 spinlock_t lock;
@@ -78,6 +80,7 @@ struct cxgb3i_adapter {
78 unsigned char hba_cnt; 80 unsigned char hba_cnt;
79 struct cxgb3i_hba *hba[MAX_NPORTS]; 81 struct cxgb3i_hba *hba[MAX_NPORTS];
80 82
83 unsigned int flags;
81 unsigned int tx_max_size; 84 unsigned int tx_max_size;
82 unsigned int rx_max_size; 85 unsigned int rx_max_size;
83 86
@@ -137,10 +140,9 @@ struct cxgb3i_task_data {
137int cxgb3i_iscsi_init(void); 140int cxgb3i_iscsi_init(void);
138void cxgb3i_iscsi_cleanup(void); 141void cxgb3i_iscsi_cleanup(void);
139 142
140struct cxgb3i_adapter *cxgb3i_adapter_add(struct t3cdev *); 143struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *);
141void cxgb3i_adapter_remove(struct t3cdev *); 144struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *);
142int cxgb3i_adapter_ulp_init(struct cxgb3i_adapter *); 145void cxgb3i_adapter_close(struct t3cdev *);
143void cxgb3i_adapter_ulp_cleanup(struct cxgb3i_adapter *);
144 146
145struct cxgb3i_hba *cxgb3i_hba_find_by_netdev(struct net_device *); 147struct cxgb3i_hba *cxgb3i_hba_find_by_netdev(struct net_device *);
146struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *, 148struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *,
diff --git a/drivers/scsi/cxgb3i/cxgb3i_init.c b/drivers/scsi/cxgb3i/cxgb3i_init.c
index 1ce9f244e46c..833dbfa3f88a 100644
--- a/drivers/scsi/cxgb3i/cxgb3i_init.c
+++ b/drivers/scsi/cxgb3i/cxgb3i_init.c
@@ -26,6 +26,7 @@ MODULE_VERSION(DRV_MODULE_VERSION);
26 26
27static void open_s3_dev(struct t3cdev *); 27static void open_s3_dev(struct t3cdev *);
28static void close_s3_dev(struct t3cdev *); 28static void close_s3_dev(struct t3cdev *);
29static void s3_err_handler(struct t3cdev *tdev, u32 status, u32 error);
29 30
30static cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS]; 31static cxgb3_cpl_handler_func cxgb3i_cpl_handlers[NUM_CPL_CMDS];
31static struct cxgb3_client t3c_client = { 32static struct cxgb3_client t3c_client = {
@@ -33,6 +34,7 @@ static struct cxgb3_client t3c_client = {
33 .handlers = cxgb3i_cpl_handlers, 34 .handlers = cxgb3i_cpl_handlers,
34 .add = open_s3_dev, 35 .add = open_s3_dev,
35 .remove = close_s3_dev, 36 .remove = close_s3_dev,
37 .err_handler = s3_err_handler,
36}; 38};
37 39
38/** 40/**
@@ -49,7 +51,7 @@ static void open_s3_dev(struct t3cdev *t3dev)
49 } 51 }
50 52
51 cxgb3i_sdev_add(t3dev, &t3c_client); 53 cxgb3i_sdev_add(t3dev, &t3c_client);
52 cxgb3i_adapter_add(t3dev); 54 cxgb3i_adapter_open(t3dev);
53} 55}
54 56
55/** 57/**
@@ -58,10 +60,29 @@ static void open_s3_dev(struct t3cdev *t3dev)
58 */ 60 */
59static void close_s3_dev(struct t3cdev *t3dev) 61static void close_s3_dev(struct t3cdev *t3dev)
60{ 62{
61 cxgb3i_adapter_remove(t3dev); 63 cxgb3i_adapter_close(t3dev);
62 cxgb3i_sdev_remove(t3dev); 64 cxgb3i_sdev_remove(t3dev);
63} 65}
64 66
67static void s3_err_handler(struct t3cdev *tdev, u32 status, u32 error)
68{
69 struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(tdev);
70
71 cxgb3i_log_info("snic 0x%p, tdev 0x%p, status 0x%x, err 0x%x.\n",
72 snic, tdev, status, error);
73 if (!snic)
74 return;
75
76 switch (status) {
77 case OFFLOAD_STATUS_DOWN:
78 snic->flags |= CXGB3I_ADAPTER_FLAG_RESET;
79 break;
80 case OFFLOAD_STATUS_UP:
81 snic->flags &= ~CXGB3I_ADAPTER_FLAG_RESET;
82 break;
83 }
84}
85
65/** 86/**
66 * cxgb3i_init_module - module init entry point 87 * cxgb3i_init_module - module init entry point
67 * 88 *
diff --git a/drivers/scsi/cxgb3i/cxgb3i_iscsi.c b/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
index e185dedc4c1f..ff6bfd66733f 100644
--- a/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
+++ b/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
@@ -53,11 +53,30 @@ static LIST_HEAD(cxgb3i_snic_list);
53static DEFINE_RWLOCK(cxgb3i_snic_rwlock); 53static DEFINE_RWLOCK(cxgb3i_snic_rwlock);
54 54
55/** 55/**
56 * cxgb3i_adapter_add - init a s3 adapter structure and any h/w settings 56 * cxgb3i_adpater_find_by_tdev - find the cxgb3i_adapter structure via t3cdev
57 * @tdev: t3cdev pointer
58 */
59struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *tdev)
60{
61 struct cxgb3i_adapter *snic;
62
63 read_lock(&cxgb3i_snic_rwlock);
64 list_for_each_entry(snic, &cxgb3i_snic_list, list_head) {
65 if (snic->tdev == tdev) {
66 read_unlock(&cxgb3i_snic_rwlock);
67 return snic;
68 }
69 }
70 read_unlock(&cxgb3i_snic_rwlock);
71 return NULL;
72}
73
74/**
75 * cxgb3i_adapter_open - init a s3 adapter structure and any h/w settings
57 * @t3dev: t3cdev adapter 76 * @t3dev: t3cdev adapter
58 * return the resulting cxgb3i_adapter struct 77 * return the resulting cxgb3i_adapter struct
59 */ 78 */
60struct cxgb3i_adapter *cxgb3i_adapter_add(struct t3cdev *t3dev) 79struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *t3dev)
61{ 80{
62 struct cxgb3i_adapter *snic; 81 struct cxgb3i_adapter *snic;
63 struct adapter *adapter = tdev2adap(t3dev); 82 struct adapter *adapter = tdev2adap(t3dev);
@@ -101,10 +120,10 @@ free_snic:
101} 120}
102 121
103/** 122/**
104 * cxgb3i_adapter_remove - release the resources held and cleanup h/w settings 123 * cxgb3i_adapter_close - release the resources held and cleanup h/w settings
105 * @t3dev: t3cdev adapter 124 * @t3dev: t3cdev adapter
106 */ 125 */
107void cxgb3i_adapter_remove(struct t3cdev *t3dev) 126void cxgb3i_adapter_close(struct t3cdev *t3dev)
108{ 127{
109 int i; 128 int i;
110 struct cxgb3i_adapter *snic; 129 struct cxgb3i_adapter *snic;