diff options
| -rw-r--r-- | drivers/scsi/fcoe/fc_transport_fcoe.c | 91 | ||||
| -rw-r--r-- | drivers/scsi/fcoe/fcoe_sw.c | 56 | ||||
| -rw-r--r-- | drivers/scsi/fcoe/libfcoe.c | 318 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_disc.c | 63 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_exch.c | 32 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_fcp.c | 56 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_lport.c | 173 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_rport.c | 197 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 9 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 19 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_version.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 26 | ||||
| -rw-r--r-- | include/scsi/fc/fc_fcoe.h | 4 | ||||
| -rw-r--r-- | include/scsi/fc/fc_fs.h | 5 | ||||
| -rw-r--r-- | include/scsi/libfc.h | 138 | ||||
| -rw-r--r-- | include/scsi/libfcoe.h | 9 |
19 files changed, 586 insertions, 631 deletions
diff --git a/drivers/scsi/fcoe/fc_transport_fcoe.c b/drivers/scsi/fcoe/fc_transport_fcoe.c index bf7fe6fc082..8862758006c 100644 --- a/drivers/scsi/fcoe/fc_transport_fcoe.c +++ b/drivers/scsi/fcoe/fc_transport_fcoe.c | |||
| @@ -33,19 +33,19 @@ static LIST_HEAD(fcoe_transports); | |||
| 33 | static DEFINE_MUTEX(fcoe_transports_lock); | 33 | static DEFINE_MUTEX(fcoe_transports_lock); |
| 34 | 34 | ||
| 35 | /** | 35 | /** |
| 36 | * fcoe_transport_default - returns ptr to the default transport fcoe_sw | 36 | * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw |
| 37 | **/ | 37 | */ |
| 38 | struct fcoe_transport *fcoe_transport_default(void) | 38 | struct fcoe_transport *fcoe_transport_default(void) |
| 39 | { | 39 | { |
| 40 | return &fcoe_sw_transport; | 40 | return &fcoe_sw_transport; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | /** | 43 | /** |
| 44 | * fcoe_transport_to_pcidev - get the pci dev from a netdev | 44 | * fcoe_transport_to_pcidev() - get the pci dev from a netdev |
| 45 | * @netdev: the netdev that pci dev will be retrived from | 45 | * @netdev: the netdev that pci dev will be retrived from |
| 46 | * | 46 | * |
| 47 | * Returns: NULL or the corrsponding pci_dev | 47 | * Returns: NULL or the corrsponding pci_dev |
| 48 | **/ | 48 | */ |
| 49 | struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev) | 49 | struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev) |
| 50 | { | 50 | { |
| 51 | if (!netdev->dev.parent) | 51 | if (!netdev->dev.parent) |
| @@ -54,18 +54,17 @@ struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev) | |||
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | /** | 56 | /** |
| 57 | * fcoe_transport_device_lookup - find out netdev is managed by the | 57 | * fcoe_transport_device_lookup() - Lookup a transport |
| 58 | * transport | ||
| 59 | * assign a transport to a device | ||
| 60 | * @netdev: the netdev the transport to be attached to | 58 | * @netdev: the netdev the transport to be attached to |
| 61 | * | 59 | * |
| 62 | * This will look for existing offload driver, if not found, it falls back to | 60 | * This will look for existing offload driver, if not found, it falls back to |
| 63 | * the default sw hba (fcoe_sw) as its fcoe transport. | 61 | * the default sw hba (fcoe_sw) as its fcoe transport. |
| 64 | * | 62 | * |
| 65 | * Returns: 0 for success | 63 | * Returns: 0 for success |
| 66 | **/ | 64 | */ |
| 67 | static struct fcoe_transport_internal *fcoe_transport_device_lookup( | 65 | static struct fcoe_transport_internal * |
| 68 | struct fcoe_transport *t, struct net_device *netdev) | 66 | fcoe_transport_device_lookup(struct fcoe_transport *t, |
| 67 | struct net_device *netdev) | ||
| 69 | { | 68 | { |
| 70 | struct fcoe_transport_internal *ti; | 69 | struct fcoe_transport_internal *ti; |
| 71 | 70 | ||
| @@ -81,14 +80,14 @@ static struct fcoe_transport_internal *fcoe_transport_device_lookup( | |||
| 81 | return NULL; | 80 | return NULL; |
| 82 | } | 81 | } |
| 83 | /** | 82 | /** |
| 84 | * fcoe_transport_device_add - assign a transport to a device | 83 | * fcoe_transport_device_add() - Assign a transport to a device |
| 85 | * @netdev: the netdev the transport to be attached to | 84 | * @netdev: the netdev the transport to be attached to |
| 86 | * | 85 | * |
| 87 | * This will look for existing offload driver, if not found, it falls back to | 86 | * This will look for existing offload driver, if not found, it falls back to |
| 88 | * the default sw hba (fcoe_sw) as its fcoe transport. | 87 | * the default sw hba (fcoe_sw) as its fcoe transport. |
| 89 | * | 88 | * |
| 90 | * Returns: 0 for success | 89 | * Returns: 0 for success |
| 91 | **/ | 90 | */ |
| 92 | static int fcoe_transport_device_add(struct fcoe_transport *t, | 91 | static int fcoe_transport_device_add(struct fcoe_transport *t, |
| 93 | struct net_device *netdev) | 92 | struct net_device *netdev) |
| 94 | { | 93 | { |
| @@ -123,14 +122,14 @@ static int fcoe_transport_device_add(struct fcoe_transport *t, | |||
| 123 | } | 122 | } |
| 124 | 123 | ||
| 125 | /** | 124 | /** |
| 126 | * fcoe_transport_device_remove - remove a device from its transport | 125 | * fcoe_transport_device_remove() - Remove a device from its transport |
| 127 | * @netdev: the netdev the transport to be attached to | 126 | * @netdev: the netdev the transport to be attached to |
| 128 | * | 127 | * |
| 129 | * this removes the device from the transport so the given transport will | 128 | * This removes the device from the transport so the given transport will |
| 130 | * not manage this device any more | 129 | * not manage this device any more |
| 131 | * | 130 | * |
| 132 | * Returns: 0 for success | 131 | * Returns: 0 for success |
| 133 | **/ | 132 | */ |
| 134 | static int fcoe_transport_device_remove(struct fcoe_transport *t, | 133 | static int fcoe_transport_device_remove(struct fcoe_transport *t, |
| 135 | struct net_device *netdev) | 134 | struct net_device *netdev) |
| 136 | { | 135 | { |
| @@ -155,13 +154,13 @@ static int fcoe_transport_device_remove(struct fcoe_transport *t, | |||
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | /** | 156 | /** |
| 158 | * fcoe_transport_device_remove_all - remove all from transport devlist | 157 | * fcoe_transport_device_remove_all() - Remove all from transport devlist |
| 159 | * | 158 | * |
| 160 | * this removes the device from the transport so the given transport will | 159 | * This removes the device from the transport so the given transport will |
| 161 | * not manage this device any more | 160 | * not manage this device any more |
| 162 | * | 161 | * |
| 163 | * Returns: 0 for success | 162 | * Returns: 0 for success |
| 164 | **/ | 163 | */ |
| 165 | static void fcoe_transport_device_remove_all(struct fcoe_transport *t) | 164 | static void fcoe_transport_device_remove_all(struct fcoe_transport *t) |
| 166 | { | 165 | { |
| 167 | struct fcoe_transport_internal *ti, *tmp; | 166 | struct fcoe_transport_internal *ti, *tmp; |
| @@ -175,18 +174,18 @@ static void fcoe_transport_device_remove_all(struct fcoe_transport *t) | |||
| 175 | } | 174 | } |
| 176 | 175 | ||
| 177 | /** | 176 | /** |
| 178 | * fcoe_transport_match - use the bus device match function to match the hw | 177 | * fcoe_transport_match() - Use the bus device match function to match the hw |
| 179 | * @t: the fcoe transport | 178 | * @t: The fcoe transport to check |
| 180 | * @netdev: | 179 | * @netdev: The netdev to match against |
| 181 | * | 180 | * |
| 182 | * This function is used to check if the givne transport wants to manage the | 181 | * This function is used to check if the given transport wants to manage the |
| 183 | * input netdev. if the transports implements the match function, it will be | 182 | * input netdev. if the transports implements the match function, it will be |
| 184 | * called, o.w. we just compare the pci vendor and device id. | 183 | * called, o.w. we just compare the pci vendor and device id. |
| 185 | * | 184 | * |
| 186 | * Returns: true for match up | 185 | * Returns: true for match up |
| 187 | **/ | 186 | */ |
| 188 | static bool fcoe_transport_match(struct fcoe_transport *t, | 187 | static bool fcoe_transport_match(struct fcoe_transport *t, |
| 189 | struct net_device *netdev) | 188 | struct net_device *netdev) |
| 190 | { | 189 | { |
| 191 | /* match transport by vendor and device id */ | 190 | /* match transport by vendor and device id */ |
| 192 | struct pci_dev *pci; | 191 | struct pci_dev *pci; |
| @@ -210,17 +209,17 @@ static bool fcoe_transport_match(struct fcoe_transport *t, | |||
| 210 | } | 209 | } |
| 211 | 210 | ||
| 212 | /** | 211 | /** |
| 213 | * fcoe_transport_lookup - check if the transport is already registered | 212 | * fcoe_transport_lookup() - Check if the transport is already registered |
| 214 | * @t: the transport to be looked up | 213 | * @t: the transport to be looked up |
| 215 | * | 214 | * |
| 216 | * This compares the parent device (pci) vendor and device id | 215 | * This compares the parent device (pci) vendor and device id |
| 217 | * | 216 | * |
| 218 | * Returns: NULL if not found | 217 | * Returns: NULL if not found |
| 219 | * | 218 | * |
| 220 | * TODO - return default sw transport if no other transport is found | 219 | * TODO: return default sw transport if no other transport is found |
| 221 | **/ | 220 | */ |
| 222 | static struct fcoe_transport *fcoe_transport_lookup( | 221 | static struct fcoe_transport * |
| 223 | struct net_device *netdev) | 222 | fcoe_transport_lookup(struct net_device *netdev) |
| 224 | { | 223 | { |
| 225 | struct fcoe_transport *t; | 224 | struct fcoe_transport *t; |
| 226 | 225 | ||
| @@ -239,11 +238,11 @@ static struct fcoe_transport *fcoe_transport_lookup( | |||
| 239 | } | 238 | } |
| 240 | 239 | ||
| 241 | /** | 240 | /** |
| 242 | * fcoe_transport_register - adds a fcoe transport to the fcoe transports list | 241 | * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list |
| 243 | * @t: ptr to the fcoe transport to be added | 242 | * @t: ptr to the fcoe transport to be added |
| 244 | * | 243 | * |
| 245 | * Returns: 0 for success | 244 | * Returns: 0 for success |
| 246 | **/ | 245 | */ |
| 247 | int fcoe_transport_register(struct fcoe_transport *t) | 246 | int fcoe_transport_register(struct fcoe_transport *t) |
| 248 | { | 247 | { |
| 249 | struct fcoe_transport *tt; | 248 | struct fcoe_transport *tt; |
| @@ -259,9 +258,6 @@ int fcoe_transport_register(struct fcoe_transport *t) | |||
| 259 | list_add_tail(&t->list, &fcoe_transports); | 258 | list_add_tail(&t->list, &fcoe_transports); |
| 260 | mutex_unlock(&fcoe_transports_lock); | 259 | mutex_unlock(&fcoe_transports_lock); |
| 261 | 260 | ||
| 262 | mutex_init(&t->devlock); | ||
| 263 | INIT_LIST_HEAD(&t->devlist); | ||
| 264 | |||
| 265 | printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name); | 261 | printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name); |
| 266 | 262 | ||
| 267 | return 0; | 263 | return 0; |
| @@ -269,11 +265,11 @@ int fcoe_transport_register(struct fcoe_transport *t) | |||
| 269 | EXPORT_SYMBOL_GPL(fcoe_transport_register); | 265 | EXPORT_SYMBOL_GPL(fcoe_transport_register); |
| 270 | 266 | ||
| 271 | /** | 267 | /** |
| 272 | * fcoe_transport_unregister - remove the tranport fro the fcoe transports list | 268 | * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list |
| 273 | * @t: ptr to the fcoe transport to be removed | 269 | * @t: ptr to the fcoe transport to be removed |
| 274 | * | 270 | * |
| 275 | * Returns: 0 for success | 271 | * Returns: 0 for success |
| 276 | **/ | 272 | */ |
| 277 | int fcoe_transport_unregister(struct fcoe_transport *t) | 273 | int fcoe_transport_unregister(struct fcoe_transport *t) |
| 278 | { | 274 | { |
| 279 | struct fcoe_transport *tt, *tmp; | 275 | struct fcoe_transport *tt, *tmp; |
| @@ -294,8 +290,8 @@ int fcoe_transport_unregister(struct fcoe_transport *t) | |||
| 294 | } | 290 | } |
| 295 | EXPORT_SYMBOL_GPL(fcoe_transport_unregister); | 291 | EXPORT_SYMBOL_GPL(fcoe_transport_unregister); |
| 296 | 292 | ||
| 297 | /* | 293 | /** |
| 298 | * fcoe_load_transport_driver - load an offload driver by alias name | 294 | * fcoe_load_transport_driver() - Load an offload driver by alias name |
| 299 | * @netdev: the target net device | 295 | * @netdev: the target net device |
| 300 | * | 296 | * |
| 301 | * Requests for an offload driver module as the fcoe transport, if fails, it | 297 | * Requests for an offload driver module as the fcoe transport, if fails, it |
| @@ -307,7 +303,7 @@ EXPORT_SYMBOL_GPL(fcoe_transport_unregister); | |||
| 307 | * 3. pure hw fcoe hba may not have netdev | 303 | * 3. pure hw fcoe hba may not have netdev |
| 308 | * | 304 | * |
| 309 | * Returns: 0 for success | 305 | * Returns: 0 for success |
| 310 | **/ | 306 | */ |
| 311 | int fcoe_load_transport_driver(struct net_device *netdev) | 307 | int fcoe_load_transport_driver(struct net_device *netdev) |
| 312 | { | 308 | { |
| 313 | struct pci_dev *pci; | 309 | struct pci_dev *pci; |
| @@ -335,14 +331,14 @@ int fcoe_load_transport_driver(struct net_device *netdev) | |||
| 335 | EXPORT_SYMBOL_GPL(fcoe_load_transport_driver); | 331 | EXPORT_SYMBOL_GPL(fcoe_load_transport_driver); |
| 336 | 332 | ||
| 337 | /** | 333 | /** |
| 338 | * fcoe_transport_attach - load transport to fcoe | 334 | * fcoe_transport_attach() - Load transport to fcoe |
| 339 | * @netdev: the netdev the transport to be attached to | 335 | * @netdev: the netdev the transport to be attached to |
| 340 | * | 336 | * |
| 341 | * This will look for existing offload driver, if not found, it falls back to | 337 | * This will look for existing offload driver, if not found, it falls back to |
| 342 | * the default sw hba (fcoe_sw) as its fcoe transport. | 338 | * the default sw hba (fcoe_sw) as its fcoe transport. |
| 343 | * | 339 | * |
| 344 | * Returns: 0 for success | 340 | * Returns: 0 for success |
| 345 | **/ | 341 | */ |
| 346 | int fcoe_transport_attach(struct net_device *netdev) | 342 | int fcoe_transport_attach(struct net_device *netdev) |
| 347 | { | 343 | { |
| 348 | struct fcoe_transport *t; | 344 | struct fcoe_transport *t; |
| @@ -373,11 +369,11 @@ int fcoe_transport_attach(struct net_device *netdev) | |||
| 373 | EXPORT_SYMBOL_GPL(fcoe_transport_attach); | 369 | EXPORT_SYMBOL_GPL(fcoe_transport_attach); |
| 374 | 370 | ||
| 375 | /** | 371 | /** |
| 376 | * fcoe_transport_release - unload transport from fcoe | 372 | * fcoe_transport_release() - Unload transport from fcoe |
| 377 | * @netdev: the net device on which fcoe is to be released | 373 | * @netdev: the net device on which fcoe is to be released |
| 378 | * | 374 | * |
| 379 | * Returns: 0 for success | 375 | * Returns: 0 for success |
| 380 | **/ | 376 | */ |
| 381 | int fcoe_transport_release(struct net_device *netdev) | 377 | int fcoe_transport_release(struct net_device *netdev) |
| 382 | { | 378 | { |
| 383 | struct fcoe_transport *t; | 379 | struct fcoe_transport *t; |
| @@ -410,12 +406,12 @@ int fcoe_transport_release(struct net_device *netdev) | |||
| 410 | EXPORT_SYMBOL_GPL(fcoe_transport_release); | 406 | EXPORT_SYMBOL_GPL(fcoe_transport_release); |
| 411 | 407 | ||
| 412 | /** | 408 | /** |
| 413 | * fcoe_transport_init - initializes fcoe transport layer | 409 | * fcoe_transport_init() - Initializes fcoe transport layer |
| 414 | * | 410 | * |
| 415 | * This prepares for the fcoe transport layer | 411 | * This prepares for the fcoe transport layer |
| 416 | * | 412 | * |
| 417 | * Returns: none | 413 | * Returns: none |
| 418 | **/ | 414 | */ |
| 419 | int __init fcoe_transport_init(void) | 415 | int __init fcoe_transport_init(void) |
| 420 | { | 416 | { |
| 421 | INIT_LIST_HEAD(&fcoe_transports); | 417 | INIT_LIST_HEAD(&fcoe_transports); |
| @@ -424,12 +420,13 @@ int __init fcoe_transport_init(void) | |||
| 424 | } | 420 | } |
| 425 | 421 | ||
| 426 | /** | 422 | /** |
| 427 | * fcoe_transport_exit - cleans up the fcoe transport layer | 423 | * fcoe_transport_exit() - Cleans up the fcoe transport layer |
| 424 | * | ||
| 428 | * This cleans up the fcoe transport layer. removing any transport on the list, | 425 | * This cleans up the fcoe transport layer. removing any transport on the list, |
| 429 | * note that the transport destroy func is not called here. | 426 | * note that the transport destroy func is not called here. |
| 430 | * | 427 | * |
| 431 | * Returns: none | 428 | * Returns: none |
| 432 | **/ | 429 | */ |
| 433 | int __exit fcoe_transport_exit(void) | 430 | int __exit fcoe_transport_exit(void) |
| 434 | { | 431 | { |
| 435 | struct fcoe_transport *t, *tmp; | 432 | struct fcoe_transport *t, *tmp; |
diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c index dc4cd5e2576..da210eba194 100644 --- a/drivers/scsi/fcoe/fcoe_sw.c +++ b/drivers/scsi/fcoe/fcoe_sw.c | |||
| @@ -104,19 +104,19 @@ static struct scsi_host_template fcoe_sw_shost_template = { | |||
| 104 | .max_sectors = 0xffff, | 104 | .max_sectors = 0xffff, |
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| 107 | /* | 107 | /** |
| 108 | * fcoe_sw_lport_config - sets up the fc_lport | 108 | * fcoe_sw_lport_config() - sets up the fc_lport |
| 109 | * @lp: ptr to the fc_lport | 109 | * @lp: ptr to the fc_lport |
| 110 | * @shost: ptr to the parent scsi host | 110 | * @shost: ptr to the parent scsi host |
| 111 | * | 111 | * |
| 112 | * Returns: 0 for success | 112 | * Returns: 0 for success |
| 113 | * | ||
| 114 | */ | 113 | */ |
| 115 | static int fcoe_sw_lport_config(struct fc_lport *lp) | 114 | static int fcoe_sw_lport_config(struct fc_lport *lp) |
| 116 | { | 115 | { |
| 117 | int i = 0; | 116 | int i = 0; |
| 118 | 117 | ||
| 119 | lp->link_status = 0; | 118 | lp->link_up = 0; |
| 119 | lp->qfull = 0; | ||
| 120 | lp->max_retry_count = 3; | 120 | lp->max_retry_count = 3; |
| 121 | lp->e_d_tov = 2 * 1000; /* FC-FS default */ | 121 | lp->e_d_tov = 2 * 1000; /* FC-FS default */ |
| 122 | lp->r_a_tov = 2 * 2 * 1000; | 122 | lp->r_a_tov = 2 * 2 * 1000; |
| @@ -136,16 +136,14 @@ static int fcoe_sw_lport_config(struct fc_lport *lp) | |||
| 136 | return 0; | 136 | return 0; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | /* | 139 | /** |
| 140 | * fcoe_sw_netdev_config - sets up fcoe_softc for lport and network | 140 | * fcoe_sw_netdev_config() - Set up netdev for SW FCoE |
| 141 | * related properties | ||
| 142 | * @lp : ptr to the fc_lport | 141 | * @lp : ptr to the fc_lport |
| 143 | * @netdev : ptr to the associated netdevice struct | 142 | * @netdev : ptr to the associated netdevice struct |
| 144 | * | 143 | * |
| 145 | * Must be called after fcoe_sw_lport_config() as it will use lport mutex | 144 | * Must be called after fcoe_sw_lport_config() as it will use lport mutex |
| 146 | * | 145 | * |
| 147 | * Returns : 0 for success | 146 | * Returns : 0 for success |
| 148 | * | ||
| 149 | */ | 147 | */ |
| 150 | static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) | 148 | static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) |
| 151 | { | 149 | { |
| @@ -181,9 +179,8 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) | |||
| 181 | if (fc_set_mfs(lp, mfs)) | 179 | if (fc_set_mfs(lp, mfs)) |
| 182 | return -EINVAL; | 180 | return -EINVAL; |
| 183 | 181 | ||
| 184 | lp->link_status = ~FC_PAUSE & ~FC_LINK_UP; | ||
| 185 | if (!fcoe_link_ok(lp)) | 182 | if (!fcoe_link_ok(lp)) |
| 186 | lp->link_status |= FC_LINK_UP; | 183 | lp->link_up = 1; |
| 187 | 184 | ||
| 188 | /* offload features support */ | 185 | /* offload features support */ |
| 189 | if (fc->real_dev->features & NETIF_F_SG) | 186 | if (fc->real_dev->features & NETIF_F_SG) |
| @@ -191,6 +188,7 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) | |||
| 191 | 188 | ||
| 192 | 189 | ||
| 193 | skb_queue_head_init(&fc->fcoe_pending_queue); | 190 | skb_queue_head_init(&fc->fcoe_pending_queue); |
| 191 | fc->fcoe_pending_queue_active = 0; | ||
| 194 | 192 | ||
| 195 | /* setup Source Mac Address */ | 193 | /* setup Source Mac Address */ |
| 196 | memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr, | 194 | memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr, |
| @@ -224,16 +222,15 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev) | |||
| 224 | return 0; | 222 | return 0; |
| 225 | } | 223 | } |
| 226 | 224 | ||
| 227 | /* | 225 | /** |
| 228 | * fcoe_sw_shost_config - sets up fc_lport->host | 226 | * fcoe_sw_shost_config() - Sets up fc_lport->host |
| 229 | * @lp : ptr to the fc_lport | 227 | * @lp : ptr to the fc_lport |
| 230 | * @shost : ptr to the associated scsi host | 228 | * @shost : ptr to the associated scsi host |
| 231 | * @dev : device associated to scsi host | 229 | * @dev : device associated to scsi host |
| 232 | * | 230 | * |
| 233 | * Must be called after fcoe_sw_lport_config) and fcoe_sw_netdev_config() | 231 | * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config() |
| 234 | * | 232 | * |
| 235 | * Returns : 0 for success | 233 | * Returns : 0 for success |
| 236 | * | ||
| 237 | */ | 234 | */ |
| 238 | static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost, | 235 | static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost, |
| 239 | struct device *dev) | 236 | struct device *dev) |
| @@ -261,8 +258,8 @@ static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost, | |||
| 261 | return 0; | 258 | return 0; |
| 262 | } | 259 | } |
| 263 | 260 | ||
| 264 | /* | 261 | /** |
| 265 | * fcoe_sw_em_config - allocates em for this lport | 262 | * fcoe_sw_em_config() - allocates em for this lport |
| 266 | * @lp: the port that em is to allocated for | 263 | * @lp: the port that em is to allocated for |
| 267 | * | 264 | * |
| 268 | * Returns : 0 on success | 265 | * Returns : 0 on success |
| @@ -279,8 +276,8 @@ static inline int fcoe_sw_em_config(struct fc_lport *lp) | |||
| 279 | return 0; | 276 | return 0; |
| 280 | } | 277 | } |
| 281 | 278 | ||
| 282 | /* | 279 | /** |
| 283 | * fcoe_sw_destroy - FCoE software HBA tear-down function | 280 | * fcoe_sw_destroy() - FCoE software HBA tear-down function |
| 284 | * @netdev: ptr to the associated net_device | 281 | * @netdev: ptr to the associated net_device |
| 285 | * | 282 | * |
| 286 | * Returns: 0 if link is OK for use by FCoE. | 283 | * Returns: 0 if link is OK for use by FCoE. |
| @@ -301,7 +298,7 @@ static int fcoe_sw_destroy(struct net_device *netdev) | |||
| 301 | if (!lp) | 298 | if (!lp) |
| 302 | return -ENODEV; | 299 | return -ENODEV; |
| 303 | 300 | ||
| 304 | fc = fcoe_softc(lp); | 301 | fc = lport_priv(lp); |
| 305 | 302 | ||
| 306 | /* Logout of the fabric */ | 303 | /* Logout of the fabric */ |
| 307 | fc_fabric_logoff(lp); | 304 | fc_fabric_logoff(lp); |
| @@ -353,8 +350,8 @@ static struct libfc_function_template fcoe_sw_libfc_fcn_templ = { | |||
| 353 | .frame_send = fcoe_xmit, | 350 | .frame_send = fcoe_xmit, |
| 354 | }; | 351 | }; |
| 355 | 352 | ||
| 356 | /* | 353 | /** |
| 357 | * fcoe_sw_create - this function creates the fcoe interface | 354 | * fcoe_sw_create() - this function creates the fcoe interface |
| 358 | * @netdev: pointer the associated netdevice | 355 | * @netdev: pointer the associated netdevice |
| 359 | * | 356 | * |
| 360 | * Creates fc_lport struct and scsi_host for lport, configures lport | 357 | * Creates fc_lport struct and scsi_host for lport, configures lport |
| @@ -440,8 +437,8 @@ out_host_put: | |||
| 440 | return rc; | 437 | return rc; |
| 441 | } | 438 | } |
| 442 | 439 | ||
| 443 | /* | 440 | /** |
| 444 | * fcoe_sw_match - the fcoe sw transport match function | 441 | * fcoe_sw_match() - The FCoE SW transport match function |
| 445 | * | 442 | * |
| 446 | * Returns : false always | 443 | * Returns : false always |
| 447 | */ | 444 | */ |
| @@ -461,8 +458,8 @@ struct fcoe_transport fcoe_sw_transport = { | |||
| 461 | .device = 0xffff, | 458 | .device = 0xffff, |
| 462 | }; | 459 | }; |
| 463 | 460 | ||
| 464 | /* | 461 | /** |
| 465 | * fcoe_sw_init - registers fcoe_sw_transport | 462 | * fcoe_sw_init() - Registers fcoe_sw_transport |
| 466 | * | 463 | * |
| 467 | * Returns : 0 on success | 464 | * Returns : 0 on success |
| 468 | */ | 465 | */ |
| @@ -471,17 +468,22 @@ int __init fcoe_sw_init(void) | |||
| 471 | /* attach to scsi transport */ | 468 | /* attach to scsi transport */ |
| 472 | scsi_transport_fcoe_sw = | 469 | scsi_transport_fcoe_sw = |
| 473 | fc_attach_transport(&fcoe_sw_transport_function); | 470 | fc_attach_transport(&fcoe_sw_transport_function); |
| 471 | |||
| 474 | if (!scsi_transport_fcoe_sw) { | 472 | if (!scsi_transport_fcoe_sw) { |
| 475 | printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n"); | 473 | printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n"); |
| 476 | return -ENODEV; | 474 | return -ENODEV; |
| 477 | } | 475 | } |
| 476 | |||
| 477 | mutex_init(&fcoe_sw_transport.devlock); | ||
| 478 | INIT_LIST_HEAD(&fcoe_sw_transport.devlist); | ||
| 479 | |||
| 478 | /* register sw transport */ | 480 | /* register sw transport */ |
| 479 | fcoe_transport_register(&fcoe_sw_transport); | 481 | fcoe_transport_register(&fcoe_sw_transport); |
| 480 | return 0; | 482 | return 0; |
| 481 | } | 483 | } |
| 482 | 484 | ||
| 483 | /* | 485 | /** |
| 484 | * fcoe_sw_exit - unregisters fcoe_sw_transport | 486 | * fcoe_sw_exit() - Unregisters fcoe_sw_transport |
| 485 | * | 487 | * |
| 486 | * Returns : 0 on success | 488 | * Returns : 0 on success |
| 487 | */ | 489 | */ |
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c index e419f486cdb..5548bf3bb58 100644 --- a/drivers/scsi/fcoe/libfcoe.c +++ b/drivers/scsi/fcoe/libfcoe.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | static int debug_fcoe; | 49 | static int debug_fcoe; |
| 50 | 50 | ||
| 51 | #define FCOE_MAX_QUEUE_DEPTH 256 | 51 | #define FCOE_MAX_QUEUE_DEPTH 256 |
| 52 | #define FCOE_LOW_QUEUE_DEPTH 32 | ||
| 52 | 53 | ||
| 53 | /* destination address mode */ | 54 | /* destination address mode */ |
| 54 | #define FCOE_GW_ADDR_MODE 0x00 | 55 | #define FCOE_GW_ADDR_MODE 0x00 |
| @@ -69,8 +70,6 @@ struct fcoe_percpu_s *fcoe_percpu[NR_CPUS]; | |||
| 69 | 70 | ||
| 70 | /* Function Prototyes */ | 71 | /* Function Prototyes */ |
| 71 | static int fcoe_check_wait_queue(struct fc_lport *); | 72 | static int fcoe_check_wait_queue(struct fc_lport *); |
| 72 | static void fcoe_insert_wait_queue_head(struct fc_lport *, struct sk_buff *); | ||
| 73 | static void fcoe_insert_wait_queue(struct fc_lport *, struct sk_buff *); | ||
| 74 | static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *); | 73 | static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *); |
| 75 | #ifdef CONFIG_HOTPLUG_CPU | 74 | #ifdef CONFIG_HOTPLUG_CPU |
| 76 | static int fcoe_cpu_callback(struct notifier_block *, ulong, void *); | 75 | static int fcoe_cpu_callback(struct notifier_block *, ulong, void *); |
| @@ -91,13 +90,13 @@ static struct notifier_block fcoe_cpu_notifier = { | |||
| 91 | }; | 90 | }; |
| 92 | 91 | ||
| 93 | /** | 92 | /** |
| 94 | * fcoe_create_percpu_data - creates the associated cpu data | 93 | * fcoe_create_percpu_data() - creates the associated cpu data |
| 95 | * @cpu: index for the cpu where fcoe cpu data will be created | 94 | * @cpu: index for the cpu where fcoe cpu data will be created |
| 96 | * | 95 | * |
| 97 | * create percpu stats block, from cpu add notifier | 96 | * create percpu stats block, from cpu add notifier |
| 98 | * | 97 | * |
| 99 | * Returns: none | 98 | * Returns: none |
| 100 | **/ | 99 | */ |
| 101 | static void fcoe_create_percpu_data(int cpu) | 100 | static void fcoe_create_percpu_data(int cpu) |
| 102 | { | 101 | { |
| 103 | struct fc_lport *lp; | 102 | struct fc_lport *lp; |
| @@ -115,13 +114,13 @@ static void fcoe_create_percpu_data(int cpu) | |||
| 115 | } | 114 | } |
| 116 | 115 | ||
| 117 | /** | 116 | /** |
| 118 | * fcoe_destroy_percpu_data - destroys the associated cpu data | 117 | * fcoe_destroy_percpu_data() - destroys the associated cpu data |
| 119 | * @cpu: index for the cpu where fcoe cpu data will destroyed | 118 | * @cpu: index for the cpu where fcoe cpu data will destroyed |
| 120 | * | 119 | * |
| 121 | * destroy percpu stats block called by cpu add/remove notifier | 120 | * destroy percpu stats block called by cpu add/remove notifier |
| 122 | * | 121 | * |
| 123 | * Retuns: none | 122 | * Retuns: none |
| 124 | **/ | 123 | */ |
| 125 | static void fcoe_destroy_percpu_data(int cpu) | 124 | static void fcoe_destroy_percpu_data(int cpu) |
| 126 | { | 125 | { |
| 127 | struct fc_lport *lp; | 126 | struct fc_lport *lp; |
| @@ -137,7 +136,7 @@ static void fcoe_destroy_percpu_data(int cpu) | |||
| 137 | } | 136 | } |
| 138 | 137 | ||
| 139 | /** | 138 | /** |
| 140 | * fcoe_cpu_callback - fcoe cpu hotplug event callback | 139 | * fcoe_cpu_callback() - fcoe cpu hotplug event callback |
| 141 | * @nfb: callback data block | 140 | * @nfb: callback data block |
| 142 | * @action: event triggering the callback | 141 | * @action: event triggering the callback |
| 143 | * @hcpu: index for the cpu of this event | 142 | * @hcpu: index for the cpu of this event |
| @@ -145,7 +144,7 @@ static void fcoe_destroy_percpu_data(int cpu) | |||
| 145 | * this creates or destroys per cpu data for fcoe | 144 | * this creates or destroys per cpu data for fcoe |
| 146 | * | 145 | * |
| 147 | * Returns NOTIFY_OK always. | 146 | * Returns NOTIFY_OK always. |
| 148 | **/ | 147 | */ |
| 149 | static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | 148 | static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, |
| 150 | void *hcpu) | 149 | void *hcpu) |
| 151 | { | 150 | { |
| @@ -166,7 +165,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | |||
| 166 | #endif /* CONFIG_HOTPLUG_CPU */ | 165 | #endif /* CONFIG_HOTPLUG_CPU */ |
| 167 | 166 | ||
| 168 | /** | 167 | /** |
| 169 | * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ | 168 | * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ |
| 170 | * @skb: the receive skb | 169 | * @skb: the receive skb |
| 171 | * @dev: associated net device | 170 | * @dev: associated net device |
| 172 | * @ptype: context | 171 | * @ptype: context |
| @@ -175,7 +174,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | |||
| 175 | * this function will receive the packet and build fc frame and pass it up | 174 | * this function will receive the packet and build fc frame and pass it up |
| 176 | * | 175 | * |
| 177 | * Returns: 0 for success | 176 | * Returns: 0 for success |
| 178 | **/ | 177 | */ |
| 179 | int fcoe_rcv(struct sk_buff *skb, struct net_device *dev, | 178 | int fcoe_rcv(struct sk_buff *skb, struct net_device *dev, |
| 180 | struct packet_type *ptype, struct net_device *olddev) | 179 | struct packet_type *ptype, struct net_device *olddev) |
| 181 | { | 180 | { |
| @@ -265,11 +264,11 @@ err2: | |||
| 265 | EXPORT_SYMBOL_GPL(fcoe_rcv); | 264 | EXPORT_SYMBOL_GPL(fcoe_rcv); |
| 266 | 265 | ||
| 267 | /** | 266 | /** |
| 268 | * fcoe_start_io - pass to netdev to start xmit for fcoe | 267 | * fcoe_start_io() - pass to netdev to start xmit for fcoe |
| 269 | * @skb: the skb to be xmitted | 268 | * @skb: the skb to be xmitted |
| 270 | * | 269 | * |
| 271 | * Returns: 0 for success | 270 | * Returns: 0 for success |
| 272 | **/ | 271 | */ |
| 273 | static inline int fcoe_start_io(struct sk_buff *skb) | 272 | static inline int fcoe_start_io(struct sk_buff *skb) |
| 274 | { | 273 | { |
| 275 | int rc; | 274 | int rc; |
| @@ -283,12 +282,12 @@ static inline int fcoe_start_io(struct sk_buff *skb) | |||
| 283 | } | 282 | } |
| 284 | 283 | ||
| 285 | /** | 284 | /** |
| 286 | * fcoe_get_paged_crc_eof - in case we need alloc a page for crc_eof | 285 | * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof |
| 287 | * @skb: the skb to be xmitted | 286 | * @skb: the skb to be xmitted |
| 288 | * @tlen: total len | 287 | * @tlen: total len |
| 289 | * | 288 | * |
| 290 | * Returns: 0 for success | 289 | * Returns: 0 for success |
| 291 | **/ | 290 | */ |
| 292 | static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) | 291 | static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) |
| 293 | { | 292 | { |
| 294 | struct fcoe_percpu_s *fps; | 293 | struct fcoe_percpu_s *fps; |
| @@ -326,13 +325,12 @@ static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) | |||
| 326 | } | 325 | } |
| 327 | 326 | ||
| 328 | /** | 327 | /** |
| 329 | * fcoe_fc_crc - calculates FC CRC in this fcoe skb | 328 | * fcoe_fc_crc() - calculates FC CRC in this fcoe skb |
| 330 | * @fp: the fc_frame containg data to be checksummed | 329 | * @fp: the fc_frame containg data to be checksummed |
| 331 | * | 330 | * |
| 332 | * This uses crc32() to calculate the crc for fc frame | 331 | * This uses crc32() to calculate the crc for fc frame |
| 333 | * Return : 32 bit crc | 332 | * Return : 32 bit crc |
| 334 | * | 333 | */ |
| 335 | **/ | ||
| 336 | u32 fcoe_fc_crc(struct fc_frame *fp) | 334 | u32 fcoe_fc_crc(struct fc_frame *fp) |
| 337 | { | 335 | { |
| 338 | struct sk_buff *skb = fp_skb(fp); | 336 | struct sk_buff *skb = fp_skb(fp); |
| @@ -363,13 +361,12 @@ u32 fcoe_fc_crc(struct fc_frame *fp) | |||
| 363 | EXPORT_SYMBOL_GPL(fcoe_fc_crc); | 361 | EXPORT_SYMBOL_GPL(fcoe_fc_crc); |
| 364 | 362 | ||
| 365 | /** | 363 | /** |
| 366 | * fcoe_xmit - FCoE frame transmit function | 364 | * fcoe_xmit() - FCoE frame transmit function |
| 367 | * @lp: the associated local port | 365 | * @lp: the associated local port |
| 368 | * @fp: the fc_frame to be transmitted | 366 | * @fp: the fc_frame to be transmitted |
| 369 | * | 367 | * |
| 370 | * Return : 0 for success | 368 | * Return : 0 for success |
| 371 | * | 369 | */ |
| 372 | **/ | ||
| 373 | int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | 370 | int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) |
| 374 | { | 371 | { |
| 375 | int wlen, rc = 0; | 372 | int wlen, rc = 0; |
| @@ -389,7 +386,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
| 389 | 386 | ||
| 390 | WARN_ON((fr_len(fp) % sizeof(u32)) != 0); | 387 | WARN_ON((fr_len(fp) % sizeof(u32)) != 0); |
| 391 | 388 | ||
| 392 | fc = fcoe_softc(lp); | 389 | fc = lport_priv(lp); |
| 393 | /* | 390 | /* |
| 394 | * if it is a flogi then we need to learn gw-addr | 391 | * if it is a flogi then we need to learn gw-addr |
| 395 | * and my own fcid | 392 | * and my own fcid |
| @@ -439,7 +436,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
| 439 | if (skb_is_nonlinear(skb)) { | 436 | if (skb_is_nonlinear(skb)) { |
| 440 | skb_frag_t *frag; | 437 | skb_frag_t *frag; |
| 441 | if (fcoe_get_paged_crc_eof(skb, tlen)) { | 438 | if (fcoe_get_paged_crc_eof(skb, tlen)) { |
| 442 | kfree(skb); | 439 | kfree_skb(skb); |
| 443 | return -ENOMEM; | 440 | return -ENOMEM; |
| 444 | } | 441 | } |
| 445 | frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; | 442 | frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; |
| @@ -502,21 +499,22 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
| 502 | rc = fcoe_start_io(skb); | 499 | rc = fcoe_start_io(skb); |
| 503 | 500 | ||
| 504 | if (rc) { | 501 | if (rc) { |
| 505 | fcoe_insert_wait_queue(lp, skb); | 502 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
| 503 | __skb_queue_tail(&fc->fcoe_pending_queue, skb); | ||
| 504 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
| 506 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | 505 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) |
| 507 | fc_pause(lp); | 506 | lp->qfull = 1; |
| 508 | } | 507 | } |
| 509 | 508 | ||
| 510 | return 0; | 509 | return 0; |
| 511 | } | 510 | } |
| 512 | EXPORT_SYMBOL_GPL(fcoe_xmit); | 511 | EXPORT_SYMBOL_GPL(fcoe_xmit); |
| 513 | 512 | ||
| 514 | /* | 513 | /** |
| 515 | * fcoe_percpu_receive_thread - recv thread per cpu | 514 | * fcoe_percpu_receive_thread() - recv thread per cpu |
| 516 | * @arg: ptr to the fcoe per cpu struct | 515 | * @arg: ptr to the fcoe per cpu struct |
| 517 | * | 516 | * |
| 518 | * Return: 0 for success | 517 | * Return: 0 for success |
| 519 | * | ||
| 520 | */ | 518 | */ |
| 521 | int fcoe_percpu_receive_thread(void *arg) | 519 | int fcoe_percpu_receive_thread(void *arg) |
| 522 | { | 520 | { |
| @@ -533,7 +531,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
| 533 | struct fcoe_softc *fc; | 531 | struct fcoe_softc *fc; |
| 534 | struct fcoe_hdr *hp; | 532 | struct fcoe_hdr *hp; |
| 535 | 533 | ||
| 536 | set_user_nice(current, 19); | 534 | set_user_nice(current, -20); |
| 537 | 535 | ||
| 538 | while (!kthread_should_stop()) { | 536 | while (!kthread_should_stop()) { |
| 539 | 537 | ||
| @@ -658,7 +656,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
| 658 | } | 656 | } |
| 659 | 657 | ||
| 660 | /** | 658 | /** |
| 661 | * fcoe_recv_flogi - flogi receive function | 659 | * fcoe_recv_flogi() - flogi receive function |
| 662 | * @fc: associated fcoe_softc | 660 | * @fc: associated fcoe_softc |
| 663 | * @fp: the recieved frame | 661 | * @fp: the recieved frame |
| 664 | * @sa: the source address of this flogi | 662 | * @sa: the source address of this flogi |
| @@ -667,7 +665,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
| 667 | * mac address for the initiator, eitehr OUI based or GW based. | 665 | * mac address for the initiator, eitehr OUI based or GW based. |
| 668 | * | 666 | * |
| 669 | * Returns: none | 667 | * Returns: none |
| 670 | **/ | 668 | */ |
| 671 | static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) | 669 | static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) |
| 672 | { | 670 | { |
| 673 | struct fc_frame_header *fh; | 671 | struct fc_frame_header *fh; |
| @@ -715,32 +713,23 @@ static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) | |||
| 715 | } | 713 | } |
| 716 | 714 | ||
| 717 | /** | 715 | /** |
| 718 | * fcoe_watchdog - fcoe timer callback | 716 | * fcoe_watchdog() - fcoe timer callback |
| 719 | * @vp: | 717 | * @vp: |
| 720 | * | 718 | * |
| 721 | * This checks the pending queue length for fcoe and put fcoe to be paused state | 719 | * This checks the pending queue length for fcoe and set lport qfull |
| 722 | * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the | 720 | * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the |
| 723 | * fcoe_hostlist. | 721 | * fcoe_hostlist. |
| 724 | * | 722 | * |
| 725 | * Returns: 0 for success | 723 | * Returns: 0 for success |
| 726 | **/ | 724 | */ |
| 727 | void fcoe_watchdog(ulong vp) | 725 | void fcoe_watchdog(ulong vp) |
| 728 | { | 726 | { |
| 729 | struct fc_lport *lp; | ||
| 730 | struct fcoe_softc *fc; | 727 | struct fcoe_softc *fc; |
| 731 | int paused = 0; | ||
| 732 | 728 | ||
| 733 | read_lock(&fcoe_hostlist_lock); | 729 | read_lock(&fcoe_hostlist_lock); |
| 734 | list_for_each_entry(fc, &fcoe_hostlist, list) { | 730 | list_for_each_entry(fc, &fcoe_hostlist, list) { |
| 735 | lp = fc->lp; | 731 | if (fc->lp) |
| 736 | if (lp) { | 732 | fcoe_check_wait_queue(fc->lp); |
| 737 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | ||
| 738 | paused = 1; | ||
| 739 | if (fcoe_check_wait_queue(lp) < FCOE_MAX_QUEUE_DEPTH) { | ||
| 740 | if (paused) | ||
| 741 | fc_unpause(lp); | ||
| 742 | } | ||
| 743 | } | ||
| 744 | } | 733 | } |
| 745 | read_unlock(&fcoe_hostlist_lock); | 734 | read_unlock(&fcoe_hostlist_lock); |
| 746 | 735 | ||
| @@ -750,96 +739,64 @@ void fcoe_watchdog(ulong vp) | |||
| 750 | 739 | ||
| 751 | 740 | ||
| 752 | /** | 741 | /** |
| 753 | * fcoe_check_wait_queue - put the skb into fcoe pending xmit queue | 742 | * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue |
| 754 | * @lp: the fc_port for this skb | 743 | * @lp: the fc_port for this skb |
| 755 | * @skb: the associated skb to be xmitted | 744 | * @skb: the associated skb to be xmitted |
| 756 | * | 745 | * |
| 757 | * This empties the wait_queue, dequeue the head of the wait_queue queue | 746 | * This empties the wait_queue, dequeue the head of the wait_queue queue |
| 758 | * and calls fcoe_start_io() for each packet, if all skb have been | 747 | * and calls fcoe_start_io() for each packet, if all skb have been |
| 759 | * transmitted, return 0 if a error occurs, then restore wait_queue and | 748 | * transmitted, return qlen or -1 if a error occurs, then restore |
| 760 | * try again later. | 749 | * wait_queue and try again later. |
| 761 | * | 750 | * |
| 762 | * The wait_queue is used when the skb transmit fails. skb will go | 751 | * The wait_queue is used when the skb transmit fails. skb will go |
| 763 | * in the wait_queue which will be emptied by the time function OR | 752 | * in the wait_queue which will be emptied by the time function OR |
| 764 | * by the next skb transmit. | 753 | * by the next skb transmit. |
| 765 | * | 754 | * |
| 766 | * Returns: 0 for success | 755 | * Returns: 0 for success |
| 767 | **/ | 756 | */ |
| 768 | static int fcoe_check_wait_queue(struct fc_lport *lp) | 757 | static int fcoe_check_wait_queue(struct fc_lport *lp) |
| 769 | { | 758 | { |
| 770 | int rc, unpause = 0; | 759 | struct fcoe_softc *fc = lport_priv(lp); |
| 771 | int paused = 0; | ||
| 772 | struct sk_buff *skb; | 760 | struct sk_buff *skb; |
| 773 | struct fcoe_softc *fc; | 761 | int rc = -1; |
| 774 | 762 | ||
| 775 | fc = fcoe_softc(lp); | ||
| 776 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 763 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
| 764 | if (fc->fcoe_pending_queue_active) | ||
| 765 | goto out; | ||
| 766 | fc->fcoe_pending_queue_active = 1; | ||
| 777 | 767 | ||
| 778 | /* | 768 | while (fc->fcoe_pending_queue.qlen) { |
| 779 | * is this interface paused? | 769 | /* keep qlen > 0 until fcoe_start_io succeeds */ |
| 780 | */ | 770 | fc->fcoe_pending_queue.qlen++; |
| 781 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | 771 | skb = __skb_dequeue(&fc->fcoe_pending_queue); |
| 782 | paused = 1; | ||
| 783 | if (fc->fcoe_pending_queue.qlen) { | ||
| 784 | while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) { | ||
| 785 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
| 786 | rc = fcoe_start_io(skb); | ||
| 787 | if (rc) { | ||
| 788 | fcoe_insert_wait_queue_head(lp, skb); | ||
| 789 | return rc; | ||
| 790 | } | ||
| 791 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | ||
| 792 | } | ||
| 793 | if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH) | ||
| 794 | unpause = 1; | ||
| 795 | } | ||
| 796 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
| 797 | if ((unpause) && (paused)) | ||
| 798 | fc_unpause(lp); | ||
| 799 | return fc->fcoe_pending_queue.qlen; | ||
| 800 | } | ||
| 801 | |||
| 802 | /** | ||
| 803 | * fcoe_insert_wait_queue_head - puts skb to fcoe pending queue head | ||
| 804 | * @lp: the fc_port for this skb | ||
| 805 | * @skb: the associated skb to be xmitted | ||
| 806 | * | ||
| 807 | * Returns: none | ||
| 808 | **/ | ||
| 809 | static void fcoe_insert_wait_queue_head(struct fc_lport *lp, | ||
| 810 | struct sk_buff *skb) | ||
| 811 | { | ||
| 812 | struct fcoe_softc *fc; | ||
| 813 | 772 | ||
| 814 | fc = fcoe_softc(lp); | 773 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); |
| 815 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 774 | rc = fcoe_start_io(skb); |
| 816 | __skb_queue_head(&fc->fcoe_pending_queue, skb); | 775 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
| 817 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
| 818 | } | ||
| 819 | 776 | ||
| 820 | /** | 777 | if (rc) { |
| 821 | * fcoe_insert_wait_queue - put the skb into fcoe pending queue tail | 778 | __skb_queue_head(&fc->fcoe_pending_queue, skb); |
| 822 | * @lp: the fc_port for this skb | 779 | /* undo temporary increment above */ |
| 823 | * @skb: the associated skb to be xmitted | 780 | fc->fcoe_pending_queue.qlen--; |
| 824 | * | 781 | break; |
| 825 | * Returns: none | 782 | } |
| 826 | **/ | 783 | /* undo temporary increment above */ |
| 827 | static void fcoe_insert_wait_queue(struct fc_lport *lp, | 784 | fc->fcoe_pending_queue.qlen--; |
| 828 | struct sk_buff *skb) | 785 | } |
| 829 | { | ||
| 830 | struct fcoe_softc *fc; | ||
| 831 | 786 | ||
| 832 | fc = fcoe_softc(lp); | 787 | if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH) |
| 833 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 788 | lp->qfull = 0; |
| 834 | __skb_queue_tail(&fc->fcoe_pending_queue, skb); | 789 | fc->fcoe_pending_queue_active = 0; |
| 790 | rc = fc->fcoe_pending_queue.qlen; | ||
| 791 | out: | ||
| 835 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | 792 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); |
| 793 | return rc; | ||
| 836 | } | 794 | } |
| 837 | 795 | ||
| 838 | /** | 796 | /** |
| 839 | * fcoe_dev_setup - setup link change notification interface | 797 | * fcoe_dev_setup() - setup link change notification interface |
| 840 | * | 798 | */ |
| 841 | **/ | 799 | static void fcoe_dev_setup() |
| 842 | static void fcoe_dev_setup(void) | ||
| 843 | { | 800 | { |
| 844 | /* | 801 | /* |
| 845 | * here setup a interface specific wd time to | 802 | * here setup a interface specific wd time to |
| @@ -849,15 +806,15 @@ static void fcoe_dev_setup(void) | |||
| 849 | } | 806 | } |
| 850 | 807 | ||
| 851 | /** | 808 | /** |
| 852 | * fcoe_dev_setup - cleanup link change notification interface | 809 | * fcoe_dev_setup() - cleanup link change notification interface |
| 853 | **/ | 810 | */ |
| 854 | static void fcoe_dev_cleanup(void) | 811 | static void fcoe_dev_cleanup(void) |
| 855 | { | 812 | { |
| 856 | unregister_netdevice_notifier(&fcoe_notifier); | 813 | unregister_netdevice_notifier(&fcoe_notifier); |
| 857 | } | 814 | } |
| 858 | 815 | ||
| 859 | /** | 816 | /** |
| 860 | * fcoe_device_notification - netdev event notification callback | 817 | * fcoe_device_notification() - netdev event notification callback |
| 861 | * @notifier: context of the notification | 818 | * @notifier: context of the notification |
| 862 | * @event: type of event | 819 | * @event: type of event |
| 863 | * @ptr: fixed array for output parsed ifname | 820 | * @ptr: fixed array for output parsed ifname |
| @@ -865,7 +822,7 @@ static void fcoe_dev_cleanup(void) | |||
| 865 | * This function is called by the ethernet driver in case of link change event | 822 | * This function is called by the ethernet driver in case of link change event |
| 866 | * | 823 | * |
| 867 | * Returns: 0 for success | 824 | * Returns: 0 for success |
| 868 | **/ | 825 | */ |
| 869 | static int fcoe_device_notification(struct notifier_block *notifier, | 826 | static int fcoe_device_notification(struct notifier_block *notifier, |
| 870 | ulong event, void *ptr) | 827 | ulong event, void *ptr) |
| 871 | { | 828 | { |
| @@ -873,7 +830,7 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
| 873 | struct net_device *real_dev = ptr; | 830 | struct net_device *real_dev = ptr; |
| 874 | struct fcoe_softc *fc; | 831 | struct fcoe_softc *fc; |
| 875 | struct fcoe_dev_stats *stats; | 832 | struct fcoe_dev_stats *stats; |
| 876 | u16 new_status; | 833 | u32 new_link_up; |
| 877 | u32 mfs; | 834 | u32 mfs; |
| 878 | int rc = NOTIFY_OK; | 835 | int rc = NOTIFY_OK; |
| 879 | 836 | ||
| @@ -890,17 +847,15 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
| 890 | goto out; | 847 | goto out; |
| 891 | } | 848 | } |
| 892 | 849 | ||
| 893 | new_status = lp->link_status; | 850 | new_link_up = lp->link_up; |
| 894 | switch (event) { | 851 | switch (event) { |
| 895 | case NETDEV_DOWN: | 852 | case NETDEV_DOWN: |
| 896 | case NETDEV_GOING_DOWN: | 853 | case NETDEV_GOING_DOWN: |
| 897 | new_status &= ~FC_LINK_UP; | 854 | new_link_up = 0; |
| 898 | break; | 855 | break; |
| 899 | case NETDEV_UP: | 856 | case NETDEV_UP: |
| 900 | case NETDEV_CHANGE: | 857 | case NETDEV_CHANGE: |
| 901 | new_status &= ~FC_LINK_UP; | 858 | new_link_up = !fcoe_link_ok(lp); |
| 902 | if (!fcoe_link_ok(lp)) | ||
| 903 | new_status |= FC_LINK_UP; | ||
| 904 | break; | 859 | break; |
| 905 | case NETDEV_CHANGEMTU: | 860 | case NETDEV_CHANGEMTU: |
| 906 | mfs = fc->real_dev->mtu - | 861 | mfs = fc->real_dev->mtu - |
| @@ -908,17 +863,15 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
| 908 | sizeof(struct fcoe_crc_eof)); | 863 | sizeof(struct fcoe_crc_eof)); |
| 909 | if (mfs >= FC_MIN_MAX_FRAME) | 864 | if (mfs >= FC_MIN_MAX_FRAME) |
| 910 | fc_set_mfs(lp, mfs); | 865 | fc_set_mfs(lp, mfs); |
| 911 | new_status &= ~FC_LINK_UP; | 866 | new_link_up = !fcoe_link_ok(lp); |
| 912 | if (!fcoe_link_ok(lp)) | ||
| 913 | new_status |= FC_LINK_UP; | ||
| 914 | break; | 867 | break; |
| 915 | case NETDEV_REGISTER: | 868 | case NETDEV_REGISTER: |
| 916 | break; | 869 | break; |
| 917 | default: | 870 | default: |
| 918 | FC_DBG("unknown event %ld call", event); | 871 | FC_DBG("unknown event %ld call", event); |
| 919 | } | 872 | } |
| 920 | if (lp->link_status != new_status) { | 873 | if (lp->link_up != new_link_up) { |
| 921 | if ((new_status & FC_LINK_UP) == FC_LINK_UP) | 874 | if (new_link_up) |
| 922 | fc_linkup(lp); | 875 | fc_linkup(lp); |
| 923 | else { | 876 | else { |
| 924 | stats = lp->dev_stats[smp_processor_id()]; | 877 | stats = lp->dev_stats[smp_processor_id()]; |
| @@ -933,12 +886,12 @@ out: | |||
| 933 | } | 886 | } |
| 934 | 887 | ||
| 935 | /** | 888 | /** |
| 936 | * fcoe_if_to_netdev - parse a name buffer to get netdev | 889 | * fcoe_if_to_netdev() - parse a name buffer to get netdev |
| 937 | * @ifname: fixed array for output parsed ifname | 890 | * @ifname: fixed array for output parsed ifname |
| 938 | * @buffer: incoming buffer to be copied | 891 | * @buffer: incoming buffer to be copied |
| 939 | * | 892 | * |
| 940 | * Returns: NULL or ptr to netdeive | 893 | * Returns: NULL or ptr to netdeive |
| 941 | **/ | 894 | */ |
| 942 | static struct net_device *fcoe_if_to_netdev(const char *buffer) | 895 | static struct net_device *fcoe_if_to_netdev(const char *buffer) |
| 943 | { | 896 | { |
| 944 | char *cp; | 897 | char *cp; |
| @@ -955,13 +908,13 @@ static struct net_device *fcoe_if_to_netdev(const char *buffer) | |||
| 955 | } | 908 | } |
| 956 | 909 | ||
| 957 | /** | 910 | /** |
| 958 | * fcoe_netdev_to_module_owner - finds out the nic drive moddule of the netdev | 911 | * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev |
| 959 | * @netdev: the target netdev | 912 | * @netdev: the target netdev |
| 960 | * | 913 | * |
| 961 | * Returns: ptr to the struct module, NULL for failure | 914 | * Returns: ptr to the struct module, NULL for failure |
| 962 | **/ | 915 | */ |
| 963 | static struct module *fcoe_netdev_to_module_owner( | 916 | static struct module * |
| 964 | const struct net_device *netdev) | 917 | fcoe_netdev_to_module_owner(const struct net_device *netdev) |
| 965 | { | 918 | { |
| 966 | struct device *dev; | 919 | struct device *dev; |
| 967 | 920 | ||
| @@ -979,12 +932,14 @@ static struct module *fcoe_netdev_to_module_owner( | |||
| 979 | } | 932 | } |
| 980 | 933 | ||
| 981 | /** | 934 | /** |
| 982 | * fcoe_ethdrv_get - holds the nic driver module by try_module_get() for | 935 | * fcoe_ethdrv_get() - Hold the Ethernet driver |
| 983 | * the corresponding netdev. | ||
| 984 | * @netdev: the target netdev | 936 | * @netdev: the target netdev |
| 985 | * | 937 | * |
| 938 | * Holds the Ethernet driver module by try_module_get() for | ||
| 939 | * the corresponding netdev. | ||
| 940 | * | ||
| 986 | * Returns: 0 for succsss | 941 | * Returns: 0 for succsss |
| 987 | **/ | 942 | */ |
| 988 | static int fcoe_ethdrv_get(const struct net_device *netdev) | 943 | static int fcoe_ethdrv_get(const struct net_device *netdev) |
| 989 | { | 944 | { |
| 990 | struct module *owner; | 945 | struct module *owner; |
| @@ -999,12 +954,14 @@ static int fcoe_ethdrv_get(const struct net_device *netdev) | |||
| 999 | } | 954 | } |
| 1000 | 955 | ||
| 1001 | /** | 956 | /** |
| 1002 | * fcoe_ethdrv_get - releases the nic driver module by module_put for | 957 | * fcoe_ethdrv_put() - Release the Ethernet driver |
| 1003 | * the corresponding netdev. | ||
| 1004 | * @netdev: the target netdev | 958 | * @netdev: the target netdev |
| 1005 | * | 959 | * |
| 960 | * Releases the Ethernet driver module by module_put for | ||
| 961 | * the corresponding netdev. | ||
| 962 | * | ||
| 1006 | * Returns: 0 for succsss | 963 | * Returns: 0 for succsss |
| 1007 | **/ | 964 | */ |
| 1008 | static int fcoe_ethdrv_put(const struct net_device *netdev) | 965 | static int fcoe_ethdrv_put(const struct net_device *netdev) |
| 1009 | { | 966 | { |
| 1010 | struct module *owner; | 967 | struct module *owner; |
| @@ -1020,12 +977,12 @@ static int fcoe_ethdrv_put(const struct net_device *netdev) | |||
| 1020 | } | 977 | } |
| 1021 | 978 | ||
| 1022 | /** | 979 | /** |
| 1023 | * fcoe_destroy- handles the destroy from sysfs | 980 | * fcoe_destroy() - handles the destroy from sysfs |
| 1024 | * @buffer: expcted to be a eth if name | 981 | * @buffer: expcted to be a eth if name |
| 1025 | * @kp: associated kernel param | 982 | * @kp: associated kernel param |
| 1026 | * | 983 | * |
| 1027 | * Returns: 0 for success | 984 | * Returns: 0 for success |
| 1028 | **/ | 985 | */ |
| 1029 | static int fcoe_destroy(const char *buffer, struct kernel_param *kp) | 986 | static int fcoe_destroy(const char *buffer, struct kernel_param *kp) |
| 1030 | { | 987 | { |
| 1031 | int rc; | 988 | int rc; |
| @@ -1058,12 +1015,12 @@ out_nodev: | |||
| 1058 | } | 1015 | } |
| 1059 | 1016 | ||
| 1060 | /** | 1017 | /** |
| 1061 | * fcoe_create - handles the create call from sysfs | 1018 | * fcoe_create() - Handles the create call from sysfs |
| 1062 | * @buffer: expcted to be a eth if name | 1019 | * @buffer: expcted to be a eth if name |
| 1063 | * @kp: associated kernel param | 1020 | * @kp: associated kernel param |
| 1064 | * | 1021 | * |
| 1065 | * Returns: 0 for success | 1022 | * Returns: 0 for success |
| 1066 | **/ | 1023 | */ |
| 1067 | static int fcoe_create(const char *buffer, struct kernel_param *kp) | 1024 | static int fcoe_create(const char *buffer, struct kernel_param *kp) |
| 1068 | { | 1025 | { |
| 1069 | int rc; | 1026 | int rc; |
| @@ -1104,8 +1061,8 @@ module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR); | |||
| 1104 | __MODULE_PARM_TYPE(destroy, "string"); | 1061 | __MODULE_PARM_TYPE(destroy, "string"); |
| 1105 | MODULE_PARM_DESC(destroy, "Destroy fcoe port"); | 1062 | MODULE_PARM_DESC(destroy, "Destroy fcoe port"); |
| 1106 | 1063 | ||
| 1107 | /* | 1064 | /** |
| 1108 | * fcoe_link_ok - check if link is ok for the fc_lport | 1065 | * fcoe_link_ok() - Check if link is ok for the fc_lport |
| 1109 | * @lp: ptr to the fc_lport | 1066 | * @lp: ptr to the fc_lport |
| 1110 | * | 1067 | * |
| 1111 | * Any permanently-disqualifying conditions have been previously checked. | 1068 | * Any permanently-disqualifying conditions have been previously checked. |
| @@ -1120,7 +1077,7 @@ MODULE_PARM_DESC(destroy, "Destroy fcoe port"); | |||
| 1120 | */ | 1077 | */ |
| 1121 | int fcoe_link_ok(struct fc_lport *lp) | 1078 | int fcoe_link_ok(struct fc_lport *lp) |
| 1122 | { | 1079 | { |
| 1123 | struct fcoe_softc *fc = fcoe_softc(lp); | 1080 | struct fcoe_softc *fc = lport_priv(lp); |
| 1124 | struct net_device *dev = fc->real_dev; | 1081 | struct net_device *dev = fc->real_dev; |
| 1125 | struct ethtool_cmd ecmd = { ETHTOOL_GSET }; | 1082 | struct ethtool_cmd ecmd = { ETHTOOL_GSET }; |
| 1126 | int rc = 0; | 1083 | int rc = 0; |
| @@ -1149,9 +1106,8 @@ int fcoe_link_ok(struct fc_lport *lp) | |||
| 1149 | } | 1106 | } |
| 1150 | EXPORT_SYMBOL_GPL(fcoe_link_ok); | 1107 | EXPORT_SYMBOL_GPL(fcoe_link_ok); |
| 1151 | 1108 | ||
| 1152 | /* | 1109 | /** |
| 1153 | * fcoe_percpu_clean - frees skb of the corresponding lport from the per | 1110 | * fcoe_percpu_clean() - Clear the pending skbs for an lport |
| 1154 | * cpu queue. | ||
| 1155 | * @lp: the fc_lport | 1111 | * @lp: the fc_lport |
| 1156 | */ | 1112 | */ |
| 1157 | void fcoe_percpu_clean(struct fc_lport *lp) | 1113 | void fcoe_percpu_clean(struct fc_lport *lp) |
| @@ -1185,11 +1141,11 @@ void fcoe_percpu_clean(struct fc_lport *lp) | |||
| 1185 | EXPORT_SYMBOL_GPL(fcoe_percpu_clean); | 1141 | EXPORT_SYMBOL_GPL(fcoe_percpu_clean); |
| 1186 | 1142 | ||
| 1187 | /** | 1143 | /** |
| 1188 | * fcoe_clean_pending_queue - dequeue skb and free it | 1144 | * fcoe_clean_pending_queue() - Dequeue a skb and free it |
| 1189 | * @lp: the corresponding fc_lport | 1145 | * @lp: the corresponding fc_lport |
| 1190 | * | 1146 | * |
| 1191 | * Returns: none | 1147 | * Returns: none |
| 1192 | **/ | 1148 | */ |
| 1193 | void fcoe_clean_pending_queue(struct fc_lport *lp) | 1149 | void fcoe_clean_pending_queue(struct fc_lport *lp) |
| 1194 | { | 1150 | { |
| 1195 | struct fcoe_softc *fc = lport_priv(lp); | 1151 | struct fcoe_softc *fc = lport_priv(lp); |
| @@ -1206,21 +1162,21 @@ void fcoe_clean_pending_queue(struct fc_lport *lp) | |||
| 1206 | EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue); | 1162 | EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue); |
| 1207 | 1163 | ||
| 1208 | /** | 1164 | /** |
| 1209 | * libfc_host_alloc - allocate a Scsi_Host with room for the fc_lport | 1165 | * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport |
| 1210 | * @sht: ptr to the scsi host templ | 1166 | * @sht: ptr to the scsi host templ |
| 1211 | * @priv_size: size of private data after fc_lport | 1167 | * @priv_size: size of private data after fc_lport |
| 1212 | * | 1168 | * |
| 1213 | * Returns: ptr to Scsi_Host | 1169 | * Returns: ptr to Scsi_Host |
| 1214 | * TODO - to libfc? | 1170 | * TODO: to libfc? |
| 1215 | */ | 1171 | */ |
| 1216 | static inline struct Scsi_Host *libfc_host_alloc( | 1172 | static inline struct Scsi_Host * |
| 1217 | struct scsi_host_template *sht, int priv_size) | 1173 | libfc_host_alloc(struct scsi_host_template *sht, int priv_size) |
| 1218 | { | 1174 | { |
| 1219 | return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size); | 1175 | return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size); |
| 1220 | } | 1176 | } |
| 1221 | 1177 | ||
| 1222 | /** | 1178 | /** |
| 1223 | * fcoe_host_alloc - allocate a Scsi_Host with room for the fcoe_softc | 1179 | * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc |
| 1224 | * @sht: ptr to the scsi host templ | 1180 | * @sht: ptr to the scsi host templ |
| 1225 | * @priv_size: size of private data after fc_lport | 1181 | * @priv_size: size of private data after fc_lport |
| 1226 | * | 1182 | * |
| @@ -1232,8 +1188,8 @@ struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *sht, int priv_size) | |||
| 1232 | } | 1188 | } |
| 1233 | EXPORT_SYMBOL_GPL(fcoe_host_alloc); | 1189 | EXPORT_SYMBOL_GPL(fcoe_host_alloc); |
| 1234 | 1190 | ||
| 1235 | /* | 1191 | /** |
| 1236 | * fcoe_reset - resets the fcoe | 1192 | * fcoe_reset() - Resets the fcoe |
| 1237 | * @shost: shost the reset is from | 1193 | * @shost: shost the reset is from |
| 1238 | * | 1194 | * |
| 1239 | * Returns: always 0 | 1195 | * Returns: always 0 |
| @@ -1246,8 +1202,8 @@ int fcoe_reset(struct Scsi_Host *shost) | |||
| 1246 | } | 1202 | } |
| 1247 | EXPORT_SYMBOL_GPL(fcoe_reset); | 1203 | EXPORT_SYMBOL_GPL(fcoe_reset); |
| 1248 | 1204 | ||
| 1249 | /* | 1205 | /** |
| 1250 | * fcoe_wwn_from_mac - converts 48-bit IEEE MAC address to 64-bit FC WWN. | 1206 | * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN. |
| 1251 | * @mac: mac address | 1207 | * @mac: mac address |
| 1252 | * @scheme: check port | 1208 | * @scheme: check port |
| 1253 | * @port: port indicator for converting | 1209 | * @port: port indicator for converting |
| @@ -1286,14 +1242,15 @@ u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], | |||
| 1286 | return wwn; | 1242 | return wwn; |
| 1287 | } | 1243 | } |
| 1288 | EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); | 1244 | EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); |
| 1289 | /* | 1245 | |
| 1290 | * fcoe_hostlist_lookup_softc - find the corresponding lport by a given device | 1246 | /** |
| 1247 | * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device | ||
| 1291 | * @device: this is currently ptr to net_device | 1248 | * @device: this is currently ptr to net_device |
| 1292 | * | 1249 | * |
| 1293 | * Returns: NULL or the located fcoe_softc | 1250 | * Returns: NULL or the located fcoe_softc |
| 1294 | */ | 1251 | */ |
| 1295 | static struct fcoe_softc *fcoe_hostlist_lookup_softc( | 1252 | static struct fcoe_softc * |
| 1296 | const struct net_device *dev) | 1253 | fcoe_hostlist_lookup_softc(const struct net_device *dev) |
| 1297 | { | 1254 | { |
| 1298 | struct fcoe_softc *fc; | 1255 | struct fcoe_softc *fc; |
| 1299 | 1256 | ||
| @@ -1308,8 +1265,8 @@ static struct fcoe_softc *fcoe_hostlist_lookup_softc( | |||
| 1308 | return NULL; | 1265 | return NULL; |
| 1309 | } | 1266 | } |
| 1310 | 1267 | ||
| 1311 | /* | 1268 | /** |
| 1312 | * fcoe_hostlist_lookup - find the corresponding lport by netdev | 1269 | * fcoe_hostlist_lookup() - Find the corresponding lport by netdev |
| 1313 | * @netdev: ptr to net_device | 1270 | * @netdev: ptr to net_device |
| 1314 | * | 1271 | * |
| 1315 | * Returns: 0 for success | 1272 | * Returns: 0 for success |
| @@ -1324,8 +1281,8 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) | |||
| 1324 | } | 1281 | } |
| 1325 | EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup); | 1282 | EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup); |
| 1326 | 1283 | ||
| 1327 | /* | 1284 | /** |
| 1328 | * fcoe_hostlist_add - add a lport to lports list | 1285 | * fcoe_hostlist_add() - Add a lport to lports list |
| 1329 | * @lp: ptr to the fc_lport to badded | 1286 | * @lp: ptr to the fc_lport to badded |
| 1330 | * | 1287 | * |
| 1331 | * Returns: 0 for success | 1288 | * Returns: 0 for success |
| @@ -1336,7 +1293,7 @@ int fcoe_hostlist_add(const struct fc_lport *lp) | |||
| 1336 | 1293 | ||
| 1337 | fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp)); | 1294 | fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp)); |
| 1338 | if (!fc) { | 1295 | if (!fc) { |
| 1339 | fc = fcoe_softc(lp); | 1296 | fc = lport_priv(lp); |
| 1340 | write_lock_bh(&fcoe_hostlist_lock); | 1297 | write_lock_bh(&fcoe_hostlist_lock); |
| 1341 | list_add_tail(&fc->list, &fcoe_hostlist); | 1298 | list_add_tail(&fc->list, &fcoe_hostlist); |
| 1342 | write_unlock_bh(&fcoe_hostlist_lock); | 1299 | write_unlock_bh(&fcoe_hostlist_lock); |
| @@ -1345,8 +1302,8 @@ int fcoe_hostlist_add(const struct fc_lport *lp) | |||
| 1345 | } | 1302 | } |
| 1346 | EXPORT_SYMBOL_GPL(fcoe_hostlist_add); | 1303 | EXPORT_SYMBOL_GPL(fcoe_hostlist_add); |
| 1347 | 1304 | ||
| 1348 | /* | 1305 | /** |
| 1349 | * fcoe_hostlist_remove - remove a lport from lports list | 1306 | * fcoe_hostlist_remove() - remove a lport from lports list |
| 1350 | * @lp: ptr to the fc_lport to badded | 1307 | * @lp: ptr to the fc_lport to badded |
| 1351 | * | 1308 | * |
| 1352 | * Returns: 0 for success | 1309 | * Returns: 0 for success |
| @@ -1366,12 +1323,12 @@ int fcoe_hostlist_remove(const struct fc_lport *lp) | |||
| 1366 | EXPORT_SYMBOL_GPL(fcoe_hostlist_remove); | 1323 | EXPORT_SYMBOL_GPL(fcoe_hostlist_remove); |
| 1367 | 1324 | ||
| 1368 | /** | 1325 | /** |
| 1369 | * fcoe_libfc_config - sets up libfc related properties for lport | 1326 | * fcoe_libfc_config() - sets up libfc related properties for lport |
| 1370 | * @lp: ptr to the fc_lport | 1327 | * @lp: ptr to the fc_lport |
| 1371 | * @tt: libfc function template | 1328 | * @tt: libfc function template |
| 1372 | * | 1329 | * |
| 1373 | * Returns : 0 for success | 1330 | * Returns : 0 for success |
| 1374 | **/ | 1331 | */ |
| 1375 | int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) | 1332 | int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) |
| 1376 | { | 1333 | { |
| 1377 | /* Set the function pointers set by the LLDD */ | 1334 | /* Set the function pointers set by the LLDD */ |
| @@ -1389,14 +1346,14 @@ int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) | |||
| 1389 | EXPORT_SYMBOL_GPL(fcoe_libfc_config); | 1346 | EXPORT_SYMBOL_GPL(fcoe_libfc_config); |
| 1390 | 1347 | ||
| 1391 | /** | 1348 | /** |
| 1392 | * fcoe_init - fcoe module loading initialization | 1349 | * fcoe_init() - fcoe module loading initialization |
| 1393 | * | 1350 | * |
| 1394 | * Initialization routine | 1351 | * Initialization routine |
| 1395 | * 1. Will create fc transport software structure | 1352 | * 1. Will create fc transport software structure |
| 1396 | * 2. initialize the link list of port information structure | 1353 | * 2. initialize the link list of port information structure |
| 1397 | * | 1354 | * |
| 1398 | * Returns 0 on success, negative on failure | 1355 | * Returns 0 on success, negative on failure |
| 1399 | **/ | 1356 | */ |
| 1400 | static int __init fcoe_init(void) | 1357 | static int __init fcoe_init(void) |
| 1401 | { | 1358 | { |
| 1402 | int cpu; | 1359 | int cpu; |
| @@ -1433,7 +1390,6 @@ static int __init fcoe_init(void) | |||
| 1433 | } else { | 1390 | } else { |
| 1434 | fcoe_percpu[cpu] = NULL; | 1391 | fcoe_percpu[cpu] = NULL; |
| 1435 | kfree(p); | 1392 | kfree(p); |
| 1436 | |||
| 1437 | } | 1393 | } |
| 1438 | } | 1394 | } |
| 1439 | } | 1395 | } |
| @@ -1443,11 +1399,9 @@ static int __init fcoe_init(void) | |||
| 1443 | */ | 1399 | */ |
| 1444 | fcoe_dev_setup(); | 1400 | fcoe_dev_setup(); |
| 1445 | 1401 | ||
| 1446 | init_timer(&fcoe_timer); | 1402 | setup_timer(&fcoe_timer, fcoe_watchdog, 0); |
| 1447 | fcoe_timer.data = 0; | 1403 | |
| 1448 | fcoe_timer.function = fcoe_watchdog; | 1404 | mod_timer(&fcoe_timer, jiffies + (10 * HZ)); |
| 1449 | fcoe_timer.expires = (jiffies + (10 * HZ)); | ||
| 1450 | add_timer(&fcoe_timer); | ||
| 1451 | 1405 | ||
| 1452 | /* initiatlize the fcoe transport */ | 1406 | /* initiatlize the fcoe transport */ |
| 1453 | fcoe_transport_init(); | 1407 | fcoe_transport_init(); |
| @@ -1459,10 +1413,10 @@ static int __init fcoe_init(void) | |||
| 1459 | module_init(fcoe_init); | 1413 | module_init(fcoe_init); |
| 1460 | 1414 | ||
| 1461 | /** | 1415 | /** |
| 1462 | * fcoe_exit - fcoe module unloading cleanup | 1416 | * fcoe_exit() - fcoe module unloading cleanup |
| 1463 | * | 1417 | * |
| 1464 | * Returns 0 on success, negative on failure | 1418 | * Returns 0 on success, negative on failure |
| 1465 | **/ | 1419 | */ |
| 1466 | static void __exit fcoe_exit(void) | 1420 | static void __exit fcoe_exit(void) |
| 1467 | { | 1421 | { |
| 1468 | u32 idx; | 1422 | u32 idx; |
| @@ -1483,7 +1437,7 @@ static void __exit fcoe_exit(void) | |||
| 1483 | */ | 1437 | */ |
| 1484 | del_timer_sync(&fcoe_timer); | 1438 | del_timer_sync(&fcoe_timer); |
| 1485 | 1439 | ||
| 1486 | /* releases the assocaited fcoe transport for each lport */ | 1440 | /* releases the associated fcoe transport for each lport */ |
| 1487 | list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list) | 1441 | list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list) |
| 1488 | fcoe_transport_release(fc->real_dev); | 1442 | fcoe_transport_release(fc->real_dev); |
| 1489 | 1443 | ||
diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c index dd1564c9e04..e57556ea5b4 100644 --- a/drivers/scsi/libfc/fc_disc.c +++ b/drivers/scsi/libfc/fc_disc.c | |||
| @@ -64,7 +64,7 @@ static void fc_disc_single(struct fc_disc *, struct fc_disc_port *); | |||
| 64 | static void fc_disc_restart(struct fc_disc *); | 64 | static void fc_disc_restart(struct fc_disc *); |
| 65 | 65 | ||
| 66 | /** | 66 | /** |
| 67 | * fc_disc_lookup_rport - lookup a remote port by port_id | 67 | * fc_disc_lookup_rport() - lookup a remote port by port_id |
| 68 | * @lport: Fibre Channel host port instance | 68 | * @lport: Fibre Channel host port instance |
| 69 | * @port_id: remote port port_id to match | 69 | * @port_id: remote port port_id to match |
| 70 | */ | 70 | */ |
| @@ -92,7 +92,7 @@ struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport, | |||
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | /** | 94 | /** |
| 95 | * fc_disc_stop_rports - delete all the remote ports associated with the lport | 95 | * fc_disc_stop_rports() - delete all the remote ports associated with the lport |
| 96 | * @disc: The discovery job to stop rports on | 96 | * @disc: The discovery job to stop rports on |
| 97 | * | 97 | * |
| 98 | * Locking Note: This function expects that the lport mutex is locked before | 98 | * Locking Note: This function expects that the lport mutex is locked before |
| @@ -117,7 +117,7 @@ void fc_disc_stop_rports(struct fc_disc *disc) | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /** | 119 | /** |
| 120 | * fc_disc_rport_callback - Event handler for rport events | 120 | * fc_disc_rport_callback() - Event handler for rport events |
| 121 | * @lport: The lport which is receiving the event | 121 | * @lport: The lport which is receiving the event |
| 122 | * @rport: The rport which the event has occured on | 122 | * @rport: The rport which the event has occured on |
| 123 | * @event: The event that occured | 123 | * @event: The event that occured |
| @@ -151,7 +151,7 @@ static void fc_disc_rport_callback(struct fc_lport *lport, | |||
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /** | 153 | /** |
| 154 | * fc_disc_recv_rscn_req - Handle Registered State Change Notification (RSCN) | 154 | * fc_disc_recv_rscn_req() - Handle Registered State Change Notification (RSCN) |
| 155 | * @sp: Current sequence of the RSCN exchange | 155 | * @sp: Current sequence of the RSCN exchange |
| 156 | * @fp: RSCN Frame | 156 | * @fp: RSCN Frame |
| 157 | * @lport: Fibre Channel host port instance | 157 | * @lport: Fibre Channel host port instance |
| @@ -246,7 +246,7 @@ static void fc_disc_recv_rscn_req(struct fc_seq *sp, struct fc_frame *fp, | |||
| 246 | list_del(&dp->peers); | 246 | list_del(&dp->peers); |
| 247 | rport = lport->tt.rport_lookup(lport, dp->ids.port_id); | 247 | rport = lport->tt.rport_lookup(lport, dp->ids.port_id); |
| 248 | if (rport) { | 248 | if (rport) { |
| 249 | rdata = RPORT_TO_PRIV(rport); | 249 | rdata = rport->dd_data; |
| 250 | list_del(&rdata->peers); | 250 | list_del(&rdata->peers); |
| 251 | lport->tt.rport_logoff(rport); | 251 | lport->tt.rport_logoff(rport); |
| 252 | } | 252 | } |
| @@ -265,7 +265,7 @@ reject: | |||
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | /** | 267 | /** |
| 268 | * fc_disc_recv_req - Handle incoming requests | 268 | * fc_disc_recv_req() - Handle incoming requests |
| 269 | * @sp: Current sequence of the request exchange | 269 | * @sp: Current sequence of the request exchange |
| 270 | * @fp: The frame | 270 | * @fp: The frame |
| 271 | * @lport: The FC local port | 271 | * @lport: The FC local port |
| @@ -294,7 +294,7 @@ static void fc_disc_recv_req(struct fc_seq *sp, struct fc_frame *fp, | |||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | /** | 296 | /** |
| 297 | * fc_disc_restart - Restart discovery | 297 | * fc_disc_restart() - Restart discovery |
| 298 | * @lport: FC discovery context | 298 | * @lport: FC discovery context |
| 299 | * | 299 | * |
| 300 | * Locking Note: This function expects that the disc mutex | 300 | * Locking Note: This function expects that the disc mutex |
| @@ -322,7 +322,7 @@ static void fc_disc_restart(struct fc_disc *disc) | |||
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | /** | 324 | /** |
| 325 | * fc_disc_start - Fibre Channel Target discovery | 325 | * fc_disc_start() - Fibre Channel Target discovery |
| 326 | * @lport: FC local port | 326 | * @lport: FC local port |
| 327 | * | 327 | * |
| 328 | * Returns non-zero if discovery cannot be started. | 328 | * Returns non-zero if discovery cannot be started. |
| @@ -383,7 +383,7 @@ static struct fc_rport_operations fc_disc_rport_ops = { | |||
| 383 | }; | 383 | }; |
| 384 | 384 | ||
| 385 | /** | 385 | /** |
| 386 | * fc_disc_new_target - Handle new target found by discovery | 386 | * fc_disc_new_target() - Handle new target found by discovery |
| 387 | * @lport: FC local port | 387 | * @lport: FC local port |
| 388 | * @rport: The previous FC remote port (NULL if new remote port) | 388 | * @rport: The previous FC remote port (NULL if new remote port) |
| 389 | * @ids: Identifiers for the new FC remote port | 389 | * @ids: Identifiers for the new FC remote port |
| @@ -396,7 +396,7 @@ static int fc_disc_new_target(struct fc_disc *disc, | |||
| 396 | struct fc_rport_identifiers *ids) | 396 | struct fc_rport_identifiers *ids) |
| 397 | { | 397 | { |
| 398 | struct fc_lport *lport = disc->lport; | 398 | struct fc_lport *lport = disc->lport; |
| 399 | struct fc_rport_libfc_priv *rp; | 399 | struct fc_rport_libfc_priv *rdata; |
| 400 | int error = 0; | 400 | int error = 0; |
| 401 | 401 | ||
| 402 | if (rport && ids->port_name) { | 402 | if (rport && ids->port_name) { |
| @@ -430,15 +430,15 @@ static int fc_disc_new_target(struct fc_disc *disc, | |||
| 430 | dp.ids.port_name = ids->port_name; | 430 | dp.ids.port_name = ids->port_name; |
| 431 | dp.ids.node_name = ids->node_name; | 431 | dp.ids.node_name = ids->node_name; |
| 432 | dp.ids.roles = ids->roles; | 432 | dp.ids.roles = ids->roles; |
| 433 | rport = fc_rport_rogue_create(&dp); | 433 | rport = lport->tt.rport_create(&dp); |
| 434 | } | 434 | } |
| 435 | if (!rport) | 435 | if (!rport) |
| 436 | error = -ENOMEM; | 436 | error = -ENOMEM; |
| 437 | } | 437 | } |
| 438 | if (rport) { | 438 | if (rport) { |
| 439 | rp = rport->dd_data; | 439 | rdata = rport->dd_data; |
| 440 | rp->ops = &fc_disc_rport_ops; | 440 | rdata->ops = &fc_disc_rport_ops; |
| 441 | rp->rp_state = RPORT_ST_INIT; | 441 | rdata->rp_state = RPORT_ST_INIT; |
| 442 | lport->tt.rport_login(rport); | 442 | lport->tt.rport_login(rport); |
| 443 | } | 443 | } |
| 444 | } | 444 | } |
| @@ -446,20 +446,20 @@ static int fc_disc_new_target(struct fc_disc *disc, | |||
| 446 | } | 446 | } |
| 447 | 447 | ||
| 448 | /** | 448 | /** |
| 449 | * fc_disc_del_target - Delete a target | 449 | * fc_disc_del_target() - Delete a target |
| 450 | * @disc: FC discovery context | 450 | * @disc: FC discovery context |
| 451 | * @rport: The remote port to be removed | 451 | * @rport: The remote port to be removed |
| 452 | */ | 452 | */ |
| 453 | static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport) | 453 | static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport) |
| 454 | { | 454 | { |
| 455 | struct fc_lport *lport = disc->lport; | 455 | struct fc_lport *lport = disc->lport; |
| 456 | struct fc_rport_libfc_priv *rdata = RPORT_TO_PRIV(rport); | 456 | struct fc_rport_libfc_priv *rdata = rport->dd_data; |
| 457 | list_del(&rdata->peers); | 457 | list_del(&rdata->peers); |
| 458 | lport->tt.rport_logoff(rport); | 458 | lport->tt.rport_logoff(rport); |
| 459 | } | 459 | } |
| 460 | 460 | ||
| 461 | /** | 461 | /** |
| 462 | * fc_disc_done - Discovery has been completed | 462 | * fc_disc_done() - Discovery has been completed |
| 463 | * @disc: FC discovery context | 463 | * @disc: FC discovery context |
| 464 | */ | 464 | */ |
| 465 | static void fc_disc_done(struct fc_disc *disc) | 465 | static void fc_disc_done(struct fc_disc *disc) |
| @@ -479,7 +479,7 @@ static void fc_disc_done(struct fc_disc *disc) | |||
| 479 | } | 479 | } |
| 480 | 480 | ||
| 481 | /** | 481 | /** |
| 482 | * fc_disc_error - Handle error on dNS request | 482 | * fc_disc_error() - Handle error on dNS request |
| 483 | * @disc: FC discovery context | 483 | * @disc: FC discovery context |
| 484 | * @fp: The frame pointer | 484 | * @fp: The frame pointer |
| 485 | */ | 485 | */ |
| @@ -519,7 +519,7 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp) | |||
| 519 | } | 519 | } |
| 520 | 520 | ||
| 521 | /** | 521 | /** |
| 522 | * fc_disc_gpn_ft_req - Send Get Port Names by FC-4 type (GPN_FT) request | 522 | * fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request |
| 523 | * @lport: FC discovery context | 523 | * @lport: FC discovery context |
| 524 | * | 524 | * |
| 525 | * Locking Note: This function expects that the disc_mutex is locked | 525 | * Locking Note: This function expects that the disc_mutex is locked |
| @@ -553,7 +553,7 @@ err: | |||
| 553 | } | 553 | } |
| 554 | 554 | ||
| 555 | /** | 555 | /** |
| 556 | * fc_disc_gpn_ft_parse - Parse the list of IDs and names resulting from a request | 556 | * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request |
| 557 | * @lport: Fibre Channel host port instance | 557 | * @lport: Fibre Channel host port instance |
| 558 | * @buf: GPN_FT response buffer | 558 | * @buf: GPN_FT response buffer |
| 559 | * @len: size of response buffer | 559 | * @len: size of response buffer |
| @@ -617,7 +617,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) | |||
| 617 | 617 | ||
| 618 | if ((dp.ids.port_id != fc_host_port_id(lport->host)) && | 618 | if ((dp.ids.port_id != fc_host_port_id(lport->host)) && |
| 619 | (dp.ids.port_name != lport->wwpn)) { | 619 | (dp.ids.port_name != lport->wwpn)) { |
| 620 | rport = fc_rport_rogue_create(&dp); | 620 | rport = lport->tt.rport_create(&dp); |
| 621 | if (rport) { | 621 | if (rport) { |
| 622 | rdata = rport->dd_data; | 622 | rdata = rport->dd_data; |
| 623 | rdata->ops = &fc_disc_rport_ops; | 623 | rdata->ops = &fc_disc_rport_ops; |
| @@ -658,7 +658,10 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) | |||
| 658 | return error; | 658 | return error; |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | /* | 661 | /** |
| 662 | * fc_disc_timeout() - Retry handler for the disc component | ||
| 663 | * @work: Structure holding disc obj that needs retry discovery | ||
| 664 | * | ||
| 662 | * Handle retry of memory allocation for remote ports. | 665 | * Handle retry of memory allocation for remote ports. |
| 663 | */ | 666 | */ |
| 664 | static void fc_disc_timeout(struct work_struct *work) | 667 | static void fc_disc_timeout(struct work_struct *work) |
| @@ -673,7 +676,7 @@ static void fc_disc_timeout(struct work_struct *work) | |||
| 673 | } | 676 | } |
| 674 | 677 | ||
| 675 | /** | 678 | /** |
| 676 | * fc_disc_gpn_ft_resp - Handle a response frame from Get Port Names (GPN_FT) | 679 | * fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT) |
| 677 | * @sp: Current sequence of GPN_FT exchange | 680 | * @sp: Current sequence of GPN_FT exchange |
| 678 | * @fp: response frame | 681 | * @fp: response frame |
| 679 | * @lp_arg: Fibre Channel host port instance | 682 | * @lp_arg: Fibre Channel host port instance |
| @@ -712,9 +715,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 712 | fr_len(fp)); | 715 | fr_len(fp)); |
| 713 | } else if (ntohs(cp->ct_cmd) == FC_FS_ACC) { | 716 | } else if (ntohs(cp->ct_cmd) == FC_FS_ACC) { |
| 714 | 717 | ||
| 715 | /* | 718 | /* Accepted, parse the response. */ |
| 716 | * Accepted. Parse response. | ||
| 717 | */ | ||
| 718 | buf = cp + 1; | 719 | buf = cp + 1; |
| 719 | len -= sizeof(*cp); | 720 | len -= sizeof(*cp); |
| 720 | } else if (ntohs(cp->ct_cmd) == FC_FS_RJT) { | 721 | } else if (ntohs(cp->ct_cmd) == FC_FS_RJT) { |
| @@ -746,7 +747,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 746 | } | 747 | } |
| 747 | 748 | ||
| 748 | /** | 749 | /** |
| 749 | * fc_disc_single - Discover the directory information for a single target | 750 | * fc_disc_single() - Discover the directory information for a single target |
| 750 | * @lport: FC local port | 751 | * @lport: FC local port |
| 751 | * @dp: The port to rediscover | 752 | * @dp: The port to rediscover |
| 752 | * | 753 | * |
| @@ -769,7 +770,7 @@ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp) | |||
| 769 | if (rport) | 770 | if (rport) |
| 770 | fc_disc_del_target(disc, rport); | 771 | fc_disc_del_target(disc, rport); |
| 771 | 772 | ||
| 772 | new_rport = fc_rport_rogue_create(dp); | 773 | new_rport = lport->tt.rport_create(dp); |
| 773 | if (new_rport) { | 774 | if (new_rport) { |
| 774 | rdata = new_rport->dd_data; | 775 | rdata = new_rport->dd_data; |
| 775 | rdata->ops = &fc_disc_rport_ops; | 776 | rdata->ops = &fc_disc_rport_ops; |
| @@ -782,7 +783,7 @@ out: | |||
| 782 | } | 783 | } |
| 783 | 784 | ||
| 784 | /** | 785 | /** |
| 785 | * fc_disc_stop - Stop discovery for a given lport | 786 | * fc_disc_stop() - Stop discovery for a given lport |
| 786 | * @lport: The lport that discovery should stop for | 787 | * @lport: The lport that discovery should stop for |
| 787 | */ | 788 | */ |
| 788 | void fc_disc_stop(struct fc_lport *lport) | 789 | void fc_disc_stop(struct fc_lport *lport) |
| @@ -796,7 +797,7 @@ void fc_disc_stop(struct fc_lport *lport) | |||
| 796 | } | 797 | } |
| 797 | 798 | ||
| 798 | /** | 799 | /** |
| 799 | * fc_disc_stop_final - Stop discovery for a given lport | 800 | * fc_disc_stop_final() - Stop discovery for a given lport |
| 800 | * @lport: The lport that discovery should stop for | 801 | * @lport: The lport that discovery should stop for |
| 801 | * | 802 | * |
| 802 | * This function will block until discovery has been | 803 | * This function will block until discovery has been |
| @@ -809,7 +810,7 @@ void fc_disc_stop_final(struct fc_lport *lport) | |||
| 809 | } | 810 | } |
| 810 | 811 | ||
| 811 | /** | 812 | /** |
| 812 | * fc_disc_init - Initialize the discovery block | 813 | * fc_disc_init() - Initialize the discovery block |
| 813 | * @lport: FC local port | 814 | * @lport: FC local port |
| 814 | */ | 815 | */ |
| 815 | int fc_disc_init(struct fc_lport *lport) | 816 | int fc_disc_init(struct fc_lport *lport) |
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 66db08a5f27..505825b6124 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c | |||
| @@ -32,8 +32,6 @@ | |||
| 32 | #include <scsi/libfc.h> | 32 | #include <scsi/libfc.h> |
| 33 | #include <scsi/fc_encode.h> | 33 | #include <scsi/fc_encode.h> |
| 34 | 34 | ||
| 35 | #define FC_DEF_R_A_TOV (10 * 1000) /* resource allocation timeout */ | ||
| 36 | |||
| 37 | /* | 35 | /* |
| 38 | * fc_exch_debug can be set in debugger or at compile time to get more logs. | 36 | * fc_exch_debug can be set in debugger or at compile time to get more logs. |
| 39 | */ | 37 | */ |
| @@ -627,7 +625,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) | |||
| 627 | { | 625 | { |
| 628 | struct fc_exch *ep; | 626 | struct fc_exch *ep; |
| 629 | struct fc_frame_header *fh; | 627 | struct fc_frame_header *fh; |
| 630 | u16 rxid; | ||
| 631 | 628 | ||
| 632 | ep = mp->lp->tt.exch_get(mp->lp, fp); | 629 | ep = mp->lp->tt.exch_get(mp->lp, fp); |
| 633 | if (ep) { | 630 | if (ep) { |
| @@ -654,18 +651,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) | |||
| 654 | if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0) | 651 | if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0) |
| 655 | ep->esb_stat &= ~ESB_ST_SEQ_INIT; | 652 | ep->esb_stat &= ~ESB_ST_SEQ_INIT; |
| 656 | 653 | ||
| 657 | /* | ||
| 658 | * Set the responder ID in the frame header. | ||
| 659 | * The old one should've been 0xffff. | ||
| 660 | * If it isn't, don't assign one. | ||
| 661 | * Incoming basic link service frames may specify | ||
| 662 | * a referenced RX_ID. | ||
| 663 | */ | ||
| 664 | if (fh->fh_type != FC_TYPE_BLS) { | ||
| 665 | rxid = ntohs(fh->fh_rx_id); | ||
| 666 | WARN_ON(rxid != FC_XID_UNKNOWN); | ||
| 667 | fh->fh_rx_id = htons(ep->rxid); | ||
| 668 | } | ||
| 669 | fc_exch_hold(ep); /* hold for caller */ | 654 | fc_exch_hold(ep); /* hold for caller */ |
| 670 | spin_unlock_bh(&ep->ex_lock); /* lock from exch_get */ | 655 | spin_unlock_bh(&ep->ex_lock); /* lock from exch_get */ |
| 671 | } | 656 | } |
| @@ -677,8 +662,8 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) | |||
| 677 | * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold | 662 | * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold |
| 678 | * on the ep that should be released by the caller. | 663 | * on the ep that should be released by the caller. |
| 679 | */ | 664 | */ |
| 680 | static enum fc_pf_rjt_reason | 665 | static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_exch_mgr *mp, |
| 681 | fc_seq_lookup_recip(struct fc_exch_mgr *mp, struct fc_frame *fp) | 666 | struct fc_frame *fp) |
| 682 | { | 667 | { |
| 683 | struct fc_frame_header *fh = fc_frame_header_get(fp); | 668 | struct fc_frame_header *fh = fc_frame_header_get(fp); |
| 684 | struct fc_exch *ep = NULL; | 669 | struct fc_exch *ep = NULL; |
| @@ -996,9 +981,9 @@ static void fc_seq_send_ack(struct fc_seq *sp, const struct fc_frame *rx_fp) | |||
| 996 | * Send BLS Reject. | 981 | * Send BLS Reject. |
| 997 | * This is for rejecting BA_ABTS only. | 982 | * This is for rejecting BA_ABTS only. |
| 998 | */ | 983 | */ |
| 999 | static void | 984 | static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp, |
| 1000 | fc_exch_send_ba_rjt(struct fc_frame *rx_fp, enum fc_ba_rjt_reason reason, | 985 | enum fc_ba_rjt_reason reason, |
| 1001 | enum fc_ba_rjt_explan explan) | 986 | enum fc_ba_rjt_explan explan) |
| 1002 | { | 987 | { |
| 1003 | struct fc_frame *fp; | 988 | struct fc_frame *fp; |
| 1004 | struct fc_frame_header *rx_fh; | 989 | struct fc_frame_header *rx_fh; |
| @@ -1096,7 +1081,7 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp) | |||
| 1096 | ap->ba_high_seq_cnt = fh->fh_seq_cnt; | 1081 | ap->ba_high_seq_cnt = fh->fh_seq_cnt; |
| 1097 | ap->ba_low_seq_cnt = htons(sp->cnt); | 1082 | ap->ba_low_seq_cnt = htons(sp->cnt); |
| 1098 | } | 1083 | } |
| 1099 | sp = fc_seq_start_next(sp); | 1084 | sp = fc_seq_start_next_locked(sp); |
| 1100 | spin_unlock_bh(&ep->ex_lock); | 1085 | spin_unlock_bh(&ep->ex_lock); |
| 1101 | fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS); | 1086 | fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS); |
| 1102 | fc_frame_free(rx_fp); | 1087 | fc_frame_free(rx_fp); |
| @@ -1480,10 +1465,11 @@ static void fc_exch_reset(struct fc_exch *ep) | |||
| 1480 | * If sid is non-zero, reset only exchanges we source from that FID. | 1465 | * If sid is non-zero, reset only exchanges we source from that FID. |
| 1481 | * If did is non-zero, reset only exchanges destined to that FID. | 1466 | * If did is non-zero, reset only exchanges destined to that FID. |
| 1482 | */ | 1467 | */ |
| 1483 | void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did) | 1468 | void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did) |
| 1484 | { | 1469 | { |
| 1485 | struct fc_exch *ep; | 1470 | struct fc_exch *ep; |
| 1486 | struct fc_exch *next; | 1471 | struct fc_exch *next; |
| 1472 | struct fc_exch_mgr *mp = lp->emp; | ||
| 1487 | 1473 | ||
| 1488 | spin_lock_bh(&mp->em_lock); | 1474 | spin_lock_bh(&mp->em_lock); |
| 1489 | restart: | 1475 | restart: |
| @@ -1607,7 +1593,7 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg) | |||
| 1607 | if (IS_ERR(fp)) { | 1593 | if (IS_ERR(fp)) { |
| 1608 | int err = PTR_ERR(fp); | 1594 | int err = PTR_ERR(fp); |
| 1609 | 1595 | ||
| 1610 | if (err == -FC_EX_CLOSED) | 1596 | if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT) |
| 1611 | goto cleanup; | 1597 | goto cleanup; |
| 1612 | FC_DBG("Cannot process RRQ, because of frame error %d\n", err); | 1598 | FC_DBG("Cannot process RRQ, because of frame error %d\n", err); |
| 1613 | return; | 1599 | return; |
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c index 404e63ff46b..2a631d7dbce 100644 --- a/drivers/scsi/libfc/fc_fcp.c +++ b/drivers/scsi/libfc/fc_fcp.c | |||
| @@ -161,7 +161,7 @@ static struct fc_fcp_pkt *fc_fcp_pkt_alloc(struct fc_lport *lp, gfp_t gfp) | |||
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | /** | 163 | /** |
| 164 | * fc_fcp_pkt_release - release hold on scsi_pkt packet | 164 | * fc_fcp_pkt_release() - release hold on scsi_pkt packet |
| 165 | * @fsp: fcp packet struct | 165 | * @fsp: fcp packet struct |
| 166 | * | 166 | * |
| 167 | * This is used by upper layer scsi driver. | 167 | * This is used by upper layer scsi driver. |
| @@ -183,8 +183,7 @@ static void fc_fcp_pkt_hold(struct fc_fcp_pkt *fsp) | |||
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /** | 185 | /** |
| 186 | * fc_fcp_pkt_destory - release hold on scsi_pkt packet | 186 | * fc_fcp_pkt_destory() - release hold on scsi_pkt packet |
| 187 | * | ||
| 188 | * @seq: exchange sequence | 187 | * @seq: exchange sequence |
| 189 | * @fsp: fcp packet struct | 188 | * @fsp: fcp packet struct |
| 190 | * | 189 | * |
| @@ -199,7 +198,7 @@ static void fc_fcp_pkt_destroy(struct fc_seq *seq, void *fsp) | |||
| 199 | } | 198 | } |
| 200 | 199 | ||
| 201 | /** | 200 | /** |
| 202 | * fc_fcp_lock_pkt - lock a packet and get a ref to it. | 201 | * fc_fcp_lock_pkt() - lock a packet and get a ref to it. |
| 203 | * @fsp: fcp packet | 202 | * @fsp: fcp packet |
| 204 | * | 203 | * |
| 205 | * We should only return error if we return a command to scsi-ml before | 204 | * We should only return error if we return a command to scsi-ml before |
| @@ -291,9 +290,7 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp) | |||
| 291 | buf = fc_frame_payload_get(fp, 0); | 290 | buf = fc_frame_payload_get(fp, 0); |
| 292 | 291 | ||
| 293 | if (offset + len > fsp->data_len) { | 292 | if (offset + len > fsp->data_len) { |
| 294 | /* | 293 | /* this should never happen */ |
| 295 | * this should never happen | ||
| 296 | */ | ||
| 297 | if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) && | 294 | if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) && |
| 298 | fc_frame_crc_check(fp)) | 295 | fc_frame_crc_check(fp)) |
| 299 | goto crc_err; | 296 | goto crc_err; |
| @@ -387,8 +384,8 @@ crc_err: | |||
| 387 | fc_fcp_complete_locked(fsp); | 384 | fc_fcp_complete_locked(fsp); |
| 388 | } | 385 | } |
| 389 | 386 | ||
| 390 | /* | 387 | /** |
| 391 | * fc_fcp_send_data - Send SCSI data to target. | 388 | * fc_fcp_send_data() - Send SCSI data to target. |
| 392 | * @fsp: ptr to fc_fcp_pkt | 389 | * @fsp: ptr to fc_fcp_pkt |
| 393 | * @sp: ptr to this sequence | 390 | * @sp: ptr to this sequence |
| 394 | * @offset: starting offset for this data request | 391 | * @offset: starting offset for this data request |
| @@ -610,8 +607,8 @@ static void fc_fcp_abts_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp) | |||
| 610 | } | 607 | } |
| 611 | } | 608 | } |
| 612 | 609 | ||
| 613 | /* | 610 | /** |
| 614 | * fc_fcp_reduce_can_queue - drop can_queue | 611 | * fc_fcp_reduce_can_queue() - drop can_queue |
| 615 | * @lp: lport to drop queueing for | 612 | * @lp: lport to drop queueing for |
| 616 | * | 613 | * |
| 617 | * If we are getting memory allocation failures, then we may | 614 | * If we are getting memory allocation failures, then we may |
| @@ -642,9 +639,11 @@ done: | |||
| 642 | spin_unlock_irqrestore(lp->host->host_lock, flags); | 639 | spin_unlock_irqrestore(lp->host->host_lock, flags); |
| 643 | } | 640 | } |
| 644 | 641 | ||
| 645 | /* | 642 | /** |
| 646 | * exch mgr calls this routine to process scsi | 643 | * fc_fcp_recv() - Reveive FCP frames |
| 647 | * exchanges. | 644 | * @seq: The sequence the frame is on |
| 645 | * @fp: The FC frame | ||
| 646 | * @arg: The related FCP packet | ||
| 648 | * | 647 | * |
| 649 | * Return : None | 648 | * Return : None |
| 650 | * Context : called from Soft IRQ context | 649 | * Context : called from Soft IRQ context |
| @@ -832,7 +831,7 @@ err: | |||
| 832 | } | 831 | } |
| 833 | 832 | ||
| 834 | /** | 833 | /** |
| 835 | * fc_fcp_complete_locked - complete processing of a fcp packet | 834 | * fc_fcp_complete_locked() - complete processing of a fcp packet |
| 836 | * @fsp: fcp packet | 835 | * @fsp: fcp packet |
| 837 | * | 836 | * |
| 838 | * This function may sleep if a timer is pending. The packet lock must be | 837 | * This function may sleep if a timer is pending. The packet lock must be |
| @@ -900,7 +899,7 @@ static void fc_fcp_cleanup_cmd(struct fc_fcp_pkt *fsp, int error) | |||
| 900 | } | 899 | } |
| 901 | 900 | ||
| 902 | /** | 901 | /** |
| 903 | * fc_fcp_cleanup_each_cmd - run fn on each active command | 902 | * fc_fcp_cleanup_each_cmd() - Cleanup active commads |
| 904 | * @lp: logical port | 903 | * @lp: logical port |
| 905 | * @id: target id | 904 | * @id: target id |
| 906 | * @lun: lun | 905 | * @lun: lun |
| @@ -952,7 +951,7 @@ static void fc_fcp_abort_io(struct fc_lport *lp) | |||
| 952 | } | 951 | } |
| 953 | 952 | ||
| 954 | /** | 953 | /** |
| 955 | * fc_fcp_pkt_send - send a fcp packet to the lower level. | 954 | * fc_fcp_pkt_send() - send a fcp packet to the lower level. |
| 956 | * @lp: fc lport | 955 | * @lp: fc lport |
| 957 | * @fsp: fc packet. | 956 | * @fsp: fc packet. |
| 958 | * | 957 | * |
| @@ -1621,7 +1620,7 @@ out: | |||
| 1621 | static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp) | 1620 | static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp) |
| 1622 | { | 1621 | { |
| 1623 | /* lock ? */ | 1622 | /* lock ? */ |
| 1624 | return (lp->state == LPORT_ST_READY) && (lp->link_status & FC_LINK_UP); | 1623 | return (lp->state == LPORT_ST_READY) && lp->link_up && !lp->qfull; |
| 1625 | } | 1624 | } |
| 1626 | 1625 | ||
| 1627 | /** | 1626 | /** |
| @@ -1727,7 +1726,7 @@ out: | |||
| 1727 | EXPORT_SYMBOL(fc_queuecommand); | 1726 | EXPORT_SYMBOL(fc_queuecommand); |
| 1728 | 1727 | ||
| 1729 | /** | 1728 | /** |
| 1730 | * fc_io_compl - Handle responses for completed commands | 1729 | * fc_io_compl() - Handle responses for completed commands |
| 1731 | * @fsp: scsi packet | 1730 | * @fsp: scsi packet |
| 1732 | * | 1731 | * |
| 1733 | * Translates a error to a Linux SCSI error. | 1732 | * Translates a error to a Linux SCSI error. |
| @@ -1810,12 +1809,12 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp) | |||
| 1810 | sc_cmd->result = DID_ERROR << 16; | 1809 | sc_cmd->result = DID_ERROR << 16; |
| 1811 | break; | 1810 | break; |
| 1812 | case FC_DATA_UNDRUN: | 1811 | case FC_DATA_UNDRUN: |
| 1813 | if (fsp->cdb_status == 0) { | 1812 | if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) { |
| 1814 | /* | 1813 | /* |
| 1815 | * scsi status is good but transport level | 1814 | * scsi status is good but transport level |
| 1816 | * underrun. for read it should be an error?? | 1815 | * underrun. |
| 1817 | */ | 1816 | */ |
| 1818 | sc_cmd->result = (DID_OK << 16) | fsp->cdb_status; | 1817 | sc_cmd->result = DID_OK << 16; |
| 1819 | } else { | 1818 | } else { |
| 1820 | /* | 1819 | /* |
| 1821 | * scsi got underrun, this is an error | 1820 | * scsi got underrun, this is an error |
| @@ -1857,7 +1856,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp) | |||
| 1857 | } | 1856 | } |
| 1858 | 1857 | ||
| 1859 | /** | 1858 | /** |
| 1860 | * fc_fcp_complete - complete processing of a fcp packet | 1859 | * fc_fcp_complete() - complete processing of a fcp packet |
| 1861 | * @fsp: fcp packet | 1860 | * @fsp: fcp packet |
| 1862 | * | 1861 | * |
| 1863 | * This function may sleep if a fsp timer is pending. | 1862 | * This function may sleep if a fsp timer is pending. |
| @@ -1874,9 +1873,10 @@ void fc_fcp_complete(struct fc_fcp_pkt *fsp) | |||
| 1874 | EXPORT_SYMBOL(fc_fcp_complete); | 1873 | EXPORT_SYMBOL(fc_fcp_complete); |
| 1875 | 1874 | ||
| 1876 | /** | 1875 | /** |
| 1877 | * fc_eh_abort - Abort a command...from scsi host template | 1876 | * fc_eh_abort() - Abort a command |
| 1878 | * @sc_cmd: scsi command to abort | 1877 | * @sc_cmd: scsi command to abort |
| 1879 | * | 1878 | * |
| 1879 | * From scsi host template. | ||
| 1880 | * send ABTS to the target device and wait for the response | 1880 | * send ABTS to the target device and wait for the response |
| 1881 | * sc_cmd is the pointer to the command to be aborted. | 1881 | * sc_cmd is the pointer to the command to be aborted. |
| 1882 | */ | 1882 | */ |
| @@ -1890,7 +1890,7 @@ int fc_eh_abort(struct scsi_cmnd *sc_cmd) | |||
| 1890 | lp = shost_priv(sc_cmd->device->host); | 1890 | lp = shost_priv(sc_cmd->device->host); |
| 1891 | if (lp->state != LPORT_ST_READY) | 1891 | if (lp->state != LPORT_ST_READY) |
| 1892 | return rc; | 1892 | return rc; |
| 1893 | else if (!(lp->link_status & FC_LINK_UP)) | 1893 | else if (!lp->link_up) |
| 1894 | return rc; | 1894 | return rc; |
| 1895 | 1895 | ||
| 1896 | spin_lock_irqsave(lp->host->host_lock, flags); | 1896 | spin_lock_irqsave(lp->host->host_lock, flags); |
| @@ -1920,7 +1920,7 @@ release_pkt: | |||
| 1920 | EXPORT_SYMBOL(fc_eh_abort); | 1920 | EXPORT_SYMBOL(fc_eh_abort); |
| 1921 | 1921 | ||
| 1922 | /** | 1922 | /** |
| 1923 | * fc_eh_device_reset: Reset a single LUN | 1923 | * fc_eh_device_reset() Reset a single LUN |
| 1924 | * @sc_cmd: scsi command | 1924 | * @sc_cmd: scsi command |
| 1925 | * | 1925 | * |
| 1926 | * Set from scsi host template to send tm cmd to the target and wait for the | 1926 | * Set from scsi host template to send tm cmd to the target and wait for the |
| @@ -1973,7 +1973,7 @@ out: | |||
| 1973 | EXPORT_SYMBOL(fc_eh_device_reset); | 1973 | EXPORT_SYMBOL(fc_eh_device_reset); |
| 1974 | 1974 | ||
| 1975 | /** | 1975 | /** |
| 1976 | * fc_eh_host_reset - The reset function will reset the ports on the host. | 1976 | * fc_eh_host_reset() - The reset function will reset the ports on the host. |
| 1977 | * @sc_cmd: scsi command | 1977 | * @sc_cmd: scsi command |
| 1978 | */ | 1978 | */ |
| 1979 | int fc_eh_host_reset(struct scsi_cmnd *sc_cmd) | 1979 | int fc_eh_host_reset(struct scsi_cmnd *sc_cmd) |
| @@ -1999,7 +1999,7 @@ int fc_eh_host_reset(struct scsi_cmnd *sc_cmd) | |||
| 1999 | EXPORT_SYMBOL(fc_eh_host_reset); | 1999 | EXPORT_SYMBOL(fc_eh_host_reset); |
| 2000 | 2000 | ||
| 2001 | /** | 2001 | /** |
| 2002 | * fc_slave_alloc - configure queue depth | 2002 | * fc_slave_alloc() - configure queue depth |
| 2003 | * @sdev: scsi device | 2003 | * @sdev: scsi device |
| 2004 | * | 2004 | * |
| 2005 | * Configures queue depth based on host's cmd_per_len. If not set | 2005 | * Configures queue depth based on host's cmd_per_len. If not set |
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index 0b9bdb1fb80..2ae50a1188e 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
| @@ -139,7 +139,7 @@ static int fc_frame_drop(struct fc_lport *lport, struct fc_frame *fp) | |||
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | /** | 141 | /** |
| 142 | * fc_lport_rport_callback - Event handler for rport events | 142 | * fc_lport_rport_callback() - Event handler for rport events |
| 143 | * @lport: The lport which is receiving the event | 143 | * @lport: The lport which is receiving the event |
| 144 | * @rport: The rport which the event has occured on | 144 | * @rport: The rport which the event has occured on |
| 145 | * @event: The event that occured | 145 | * @event: The event that occured |
| @@ -195,7 +195,7 @@ static void fc_lport_rport_callback(struct fc_lport *lport, | |||
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | /** | 197 | /** |
| 198 | * fc_lport_state - Return a string which represents the lport's state | 198 | * fc_lport_state() - Return a string which represents the lport's state |
| 199 | * @lport: The lport whose state is to converted to a string | 199 | * @lport: The lport whose state is to converted to a string |
| 200 | */ | 200 | */ |
| 201 | static const char *fc_lport_state(struct fc_lport *lport) | 201 | static const char *fc_lport_state(struct fc_lport *lport) |
| @@ -209,7 +209,7 @@ static const char *fc_lport_state(struct fc_lport *lport) | |||
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | /** | 211 | /** |
| 212 | * fc_lport_ptp_setup - Create an rport for point-to-point mode | 212 | * fc_lport_ptp_setup() - Create an rport for point-to-point mode |
| 213 | * @lport: The lport to attach the ptp rport to | 213 | * @lport: The lport to attach the ptp rport to |
| 214 | * @fid: The FID of the ptp rport | 214 | * @fid: The FID of the ptp rport |
| 215 | * @remote_wwpn: The WWPN of the ptp rport | 215 | * @remote_wwpn: The WWPN of the ptp rport |
| @@ -232,7 +232,7 @@ static void fc_lport_ptp_setup(struct fc_lport *lport, | |||
| 232 | lport->ptp_rp = NULL; | 232 | lport->ptp_rp = NULL; |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | lport->ptp_rp = fc_rport_rogue_create(&dp); | 235 | lport->ptp_rp = lport->tt.rport_create(&dp); |
| 236 | 236 | ||
| 237 | lport->tt.rport_login(lport->ptp_rp); | 237 | lport->tt.rport_login(lport->ptp_rp); |
| 238 | 238 | ||
| @@ -250,7 +250,7 @@ void fc_get_host_port_state(struct Scsi_Host *shost) | |||
| 250 | { | 250 | { |
| 251 | struct fc_lport *lp = shost_priv(shost); | 251 | struct fc_lport *lp = shost_priv(shost); |
| 252 | 252 | ||
| 253 | if ((lp->link_status & FC_LINK_UP) == FC_LINK_UP) | 253 | if (lp->link_up) |
| 254 | fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; | 254 | fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; |
| 255 | else | 255 | else |
| 256 | fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; | 256 | fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; |
| @@ -351,7 +351,7 @@ static void fc_lport_add_fc4_type(struct fc_lport *lport, enum fc_fh_type type) | |||
| 351 | } | 351 | } |
| 352 | 352 | ||
| 353 | /** | 353 | /** |
| 354 | * fc_lport_recv_rlir_req - Handle received Registered Link Incident Report. | 354 | * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report. |
| 355 | * @lport: Fibre Channel local port recieving the RLIR | 355 | * @lport: Fibre Channel local port recieving the RLIR |
| 356 | * @sp: current sequence in the RLIR exchange | 356 | * @sp: current sequence in the RLIR exchange |
| 357 | * @fp: RLIR request frame | 357 | * @fp: RLIR request frame |
| @@ -370,7 +370,7 @@ static void fc_lport_recv_rlir_req(struct fc_seq *sp, struct fc_frame *fp, | |||
| 370 | } | 370 | } |
| 371 | 371 | ||
| 372 | /** | 372 | /** |
| 373 | * fc_lport_recv_echo_req - Handle received ECHO request | 373 | * fc_lport_recv_echo_req() - Handle received ECHO request |
| 374 | * @lport: Fibre Channel local port recieving the ECHO | 374 | * @lport: Fibre Channel local port recieving the ECHO |
| 375 | * @sp: current sequence in the ECHO exchange | 375 | * @sp: current sequence in the ECHO exchange |
| 376 | * @fp: ECHO request frame | 376 | * @fp: ECHO request frame |
| @@ -412,7 +412,7 @@ static void fc_lport_recv_echo_req(struct fc_seq *sp, struct fc_frame *in_fp, | |||
| 412 | } | 412 | } |
| 413 | 413 | ||
| 414 | /** | 414 | /** |
| 415 | * fc_lport_recv_echo_req - Handle received Request Node ID data request | 415 | * fc_lport_recv_echo_req() - Handle received Request Node ID data request |
| 416 | * @lport: Fibre Channel local port recieving the RNID | 416 | * @lport: Fibre Channel local port recieving the RNID |
| 417 | * @sp: current sequence in the RNID exchange | 417 | * @sp: current sequence in the RNID exchange |
| 418 | * @fp: RNID request frame | 418 | * @fp: RNID request frame |
| @@ -479,7 +479,7 @@ static void fc_lport_recv_rnid_req(struct fc_seq *sp, struct fc_frame *in_fp, | |||
| 479 | } | 479 | } |
| 480 | 480 | ||
| 481 | /** | 481 | /** |
| 482 | * fc_lport_recv_adisc_req - Handle received Address Discovery Request | 482 | * fc_lport_recv_adisc_req() - Handle received Address Discovery Request |
| 483 | * @lport: Fibre Channel local port recieving the ADISC | 483 | * @lport: Fibre Channel local port recieving the ADISC |
| 484 | * @sp: current sequence in the ADISC exchange | 484 | * @sp: current sequence in the ADISC exchange |
| 485 | * @fp: ADISC request frame | 485 | * @fp: ADISC request frame |
| @@ -529,7 +529,7 @@ static void fc_lport_recv_adisc_req(struct fc_seq *sp, struct fc_frame *in_fp, | |||
| 529 | } | 529 | } |
| 530 | 530 | ||
| 531 | /** | 531 | /** |
| 532 | * fc_lport_recv_logo_req - Handle received fabric LOGO request | 532 | * fc_lport_recv_logo_req() - Handle received fabric LOGO request |
| 533 | * @lport: Fibre Channel local port recieving the LOGO | 533 | * @lport: Fibre Channel local port recieving the LOGO |
| 534 | * @sp: current sequence in the LOGO exchange | 534 | * @sp: current sequence in the LOGO exchange |
| 535 | * @fp: LOGO request frame | 535 | * @fp: LOGO request frame |
| @@ -546,7 +546,7 @@ static void fc_lport_recv_logo_req(struct fc_seq *sp, struct fc_frame *fp, | |||
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | /** | 548 | /** |
| 549 | * fc_fabric_login - Start the lport state machine | 549 | * fc_fabric_login() - Start the lport state machine |
| 550 | * @lport: The lport that should log into the fabric | 550 | * @lport: The lport that should log into the fabric |
| 551 | * | 551 | * |
| 552 | * Locking Note: This function should not be called | 552 | * Locking Note: This function should not be called |
| @@ -568,7 +568,7 @@ int fc_fabric_login(struct fc_lport *lport) | |||
| 568 | EXPORT_SYMBOL(fc_fabric_login); | 568 | EXPORT_SYMBOL(fc_fabric_login); |
| 569 | 569 | ||
| 570 | /** | 570 | /** |
| 571 | * fc_linkup - Handler for transport linkup events | 571 | * fc_linkup() - Handler for transport linkup events |
| 572 | * @lport: The lport whose link is up | 572 | * @lport: The lport whose link is up |
| 573 | */ | 573 | */ |
| 574 | void fc_linkup(struct fc_lport *lport) | 574 | void fc_linkup(struct fc_lport *lport) |
| @@ -577,8 +577,8 @@ void fc_linkup(struct fc_lport *lport) | |||
| 577 | fc_host_port_id(lport->host)); | 577 | fc_host_port_id(lport->host)); |
| 578 | 578 | ||
| 579 | mutex_lock(&lport->lp_mutex); | 579 | mutex_lock(&lport->lp_mutex); |
| 580 | if ((lport->link_status & FC_LINK_UP) != FC_LINK_UP) { | 580 | if (!lport->link_up) { |
| 581 | lport->link_status |= FC_LINK_UP; | 581 | lport->link_up = 1; |
| 582 | 582 | ||
| 583 | if (lport->state == LPORT_ST_RESET) | 583 | if (lport->state == LPORT_ST_RESET) |
| 584 | fc_lport_enter_flogi(lport); | 584 | fc_lport_enter_flogi(lport); |
| @@ -588,7 +588,7 @@ void fc_linkup(struct fc_lport *lport) | |||
| 588 | EXPORT_SYMBOL(fc_linkup); | 588 | EXPORT_SYMBOL(fc_linkup); |
| 589 | 589 | ||
| 590 | /** | 590 | /** |
| 591 | * fc_linkdown - Handler for transport linkdown events | 591 | * fc_linkdown() - Handler for transport linkdown events |
| 592 | * @lport: The lport whose link is down | 592 | * @lport: The lport whose link is down |
| 593 | */ | 593 | */ |
| 594 | void fc_linkdown(struct fc_lport *lport) | 594 | void fc_linkdown(struct fc_lport *lport) |
| @@ -597,8 +597,8 @@ void fc_linkdown(struct fc_lport *lport) | |||
| 597 | FC_DEBUG_LPORT("Link is down for port (%6x)\n", | 597 | FC_DEBUG_LPORT("Link is down for port (%6x)\n", |
| 598 | fc_host_port_id(lport->host)); | 598 | fc_host_port_id(lport->host)); |
| 599 | 599 | ||
| 600 | if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) { | 600 | if (lport->link_up) { |
| 601 | lport->link_status &= ~(FC_LINK_UP); | 601 | lport->link_up = 0; |
| 602 | fc_lport_enter_reset(lport); | 602 | fc_lport_enter_reset(lport); |
| 603 | lport->tt.fcp_cleanup(lport); | 603 | lport->tt.fcp_cleanup(lport); |
| 604 | } | 604 | } |
| @@ -607,48 +607,25 @@ void fc_linkdown(struct fc_lport *lport) | |||
| 607 | EXPORT_SYMBOL(fc_linkdown); | 607 | EXPORT_SYMBOL(fc_linkdown); |
| 608 | 608 | ||
| 609 | /** | 609 | /** |
| 610 | * fc_pause - Pause the flow of frames | 610 | * fc_fabric_logoff() - Logout of the fabric |
| 611 | * @lport: The lport to be paused | ||
| 612 | */ | ||
| 613 | void fc_pause(struct fc_lport *lport) | ||
| 614 | { | ||
| 615 | mutex_lock(&lport->lp_mutex); | ||
| 616 | lport->link_status |= FC_PAUSE; | ||
| 617 | mutex_unlock(&lport->lp_mutex); | ||
| 618 | } | ||
| 619 | EXPORT_SYMBOL(fc_pause); | ||
| 620 | |||
| 621 | /** | ||
| 622 | * fc_unpause - Unpause the flow of frames | ||
| 623 | * @lport: The lport to be unpaused | ||
| 624 | */ | ||
| 625 | void fc_unpause(struct fc_lport *lport) | ||
| 626 | { | ||
| 627 | mutex_lock(&lport->lp_mutex); | ||
| 628 | lport->link_status &= ~(FC_PAUSE); | ||
| 629 | mutex_unlock(&lport->lp_mutex); | ||
| 630 | } | ||
| 631 | EXPORT_SYMBOL(fc_unpause); | ||
| 632 | |||
| 633 | /** | ||
| 634 | * fc_fabric_logoff - Logout of the fabric | ||
| 635 | * @lport: fc_lport pointer to logoff the fabric | 611 | * @lport: fc_lport pointer to logoff the fabric |
| 636 | * | 612 | * |
| 637 | * Return value: | 613 | * Return value: |
| 638 | * 0 for success, -1 for failure | 614 | * 0 for success, -1 for failure |
| 639 | **/ | 615 | */ |
| 640 | int fc_fabric_logoff(struct fc_lport *lport) | 616 | int fc_fabric_logoff(struct fc_lport *lport) |
| 641 | { | 617 | { |
| 642 | lport->tt.disc_stop_final(lport); | 618 | lport->tt.disc_stop_final(lport); |
| 643 | mutex_lock(&lport->lp_mutex); | 619 | mutex_lock(&lport->lp_mutex); |
| 644 | fc_lport_enter_logo(lport); | 620 | fc_lport_enter_logo(lport); |
| 645 | mutex_unlock(&lport->lp_mutex); | 621 | mutex_unlock(&lport->lp_mutex); |
| 622 | cancel_delayed_work_sync(&lport->retry_work); | ||
| 646 | return 0; | 623 | return 0; |
| 647 | } | 624 | } |
| 648 | EXPORT_SYMBOL(fc_fabric_logoff); | 625 | EXPORT_SYMBOL(fc_fabric_logoff); |
| 649 | 626 | ||
| 650 | /** | 627 | /** |
| 651 | * fc_lport_destroy - unregister a fc_lport | 628 | * fc_lport_destroy() - unregister a fc_lport |
| 652 | * @lport: fc_lport pointer to unregister | 629 | * @lport: fc_lport pointer to unregister |
| 653 | * | 630 | * |
| 654 | * Return value: | 631 | * Return value: |
| @@ -658,26 +635,25 @@ EXPORT_SYMBOL(fc_fabric_logoff); | |||
| 658 | * clean-up all the allocated memory | 635 | * clean-up all the allocated memory |
| 659 | * and free up other system resources. | 636 | * and free up other system resources. |
| 660 | * | 637 | * |
| 661 | **/ | 638 | */ |
| 662 | int fc_lport_destroy(struct fc_lport *lport) | 639 | int fc_lport_destroy(struct fc_lport *lport) |
| 663 | { | 640 | { |
| 664 | lport->tt.frame_send = fc_frame_drop; | 641 | lport->tt.frame_send = fc_frame_drop; |
| 665 | lport->tt.fcp_abort_io(lport); | 642 | lport->tt.fcp_abort_io(lport); |
| 666 | lport->tt.exch_mgr_reset(lport->emp, 0, 0); | 643 | lport->tt.exch_mgr_reset(lport, 0, 0); |
| 667 | return 0; | 644 | return 0; |
| 668 | } | 645 | } |
| 669 | EXPORT_SYMBOL(fc_lport_destroy); | 646 | EXPORT_SYMBOL(fc_lport_destroy); |
| 670 | 647 | ||
| 671 | /** | 648 | /** |
| 672 | * fc_set_mfs - sets up the mfs for the corresponding fc_lport | 649 | * fc_set_mfs() - sets up the mfs for the corresponding fc_lport |
| 673 | * @lport: fc_lport pointer to unregister | 650 | * @lport: fc_lport pointer to unregister |
| 674 | * @mfs: the new mfs for fc_lport | 651 | * @mfs: the new mfs for fc_lport |
| 675 | * | 652 | * |
| 676 | * Set mfs for the given fc_lport to the new mfs. | 653 | * Set mfs for the given fc_lport to the new mfs. |
| 677 | * | 654 | * |
| 678 | * Return: 0 for success | 655 | * Return: 0 for success |
| 679 | * | 656 | */ |
| 680 | **/ | ||
| 681 | int fc_set_mfs(struct fc_lport *lport, u32 mfs) | 657 | int fc_set_mfs(struct fc_lport *lport, u32 mfs) |
| 682 | { | 658 | { |
| 683 | unsigned int old_mfs; | 659 | unsigned int old_mfs; |
| @@ -706,7 +682,7 @@ int fc_set_mfs(struct fc_lport *lport, u32 mfs) | |||
| 706 | EXPORT_SYMBOL(fc_set_mfs); | 682 | EXPORT_SYMBOL(fc_set_mfs); |
| 707 | 683 | ||
| 708 | /** | 684 | /** |
| 709 | * fc_lport_disc_callback - Callback for discovery events | 685 | * fc_lport_disc_callback() - Callback for discovery events |
| 710 | * @lport: FC local port | 686 | * @lport: FC local port |
| 711 | * @event: The discovery event | 687 | * @event: The discovery event |
| 712 | */ | 688 | */ |
| @@ -731,7 +707,7 @@ void fc_lport_disc_callback(struct fc_lport *lport, enum fc_disc_event event) | |||
| 731 | } | 707 | } |
| 732 | 708 | ||
| 733 | /** | 709 | /** |
| 734 | * fc_rport_enter_ready - Enter the ready state and start discovery | 710 | * fc_rport_enter_ready() - Enter the ready state and start discovery |
| 735 | * @lport: Fibre Channel local port that is ready | 711 | * @lport: Fibre Channel local port that is ready |
| 736 | * | 712 | * |
| 737 | * Locking Note: The lport lock is expected to be held before calling | 713 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -748,7 +724,7 @@ static void fc_lport_enter_ready(struct fc_lport *lport) | |||
| 748 | } | 724 | } |
| 749 | 725 | ||
| 750 | /** | 726 | /** |
| 751 | * fc_lport_recv_flogi_req - Receive a FLOGI request | 727 | * fc_lport_recv_flogi_req() - Receive a FLOGI request |
| 752 | * @sp_in: The sequence the FLOGI is on | 728 | * @sp_in: The sequence the FLOGI is on |
| 753 | * @rx_fp: The frame the FLOGI is in | 729 | * @rx_fp: The frame the FLOGI is in |
| 754 | * @lport: The lport that recieved the request | 730 | * @lport: The lport that recieved the request |
| @@ -838,7 +814,7 @@ out: | |||
| 838 | } | 814 | } |
| 839 | 815 | ||
| 840 | /** | 816 | /** |
| 841 | * fc_lport_recv_req - The generic lport request handler | 817 | * fc_lport_recv_req() - The generic lport request handler |
| 842 | * @lport: The lport that received the request | 818 | * @lport: The lport that received the request |
| 843 | * @sp: The sequence the request is on | 819 | * @sp: The sequence the request is on |
| 844 | * @fp: The frame the request is in | 820 | * @fp: The frame the request is in |
| @@ -934,7 +910,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp, | |||
| 934 | } | 910 | } |
| 935 | 911 | ||
| 936 | /** | 912 | /** |
| 937 | * fc_lport_reset - Reset an lport | 913 | * fc_lport_reset() - Reset an lport |
| 938 | * @lport: The lport which should be reset | 914 | * @lport: The lport which should be reset |
| 939 | * | 915 | * |
| 940 | * Locking Note: This functions should not be called with the | 916 | * Locking Note: This functions should not be called with the |
| @@ -942,6 +918,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp, | |||
| 942 | */ | 918 | */ |
| 943 | int fc_lport_reset(struct fc_lport *lport) | 919 | int fc_lport_reset(struct fc_lport *lport) |
| 944 | { | 920 | { |
| 921 | cancel_delayed_work_sync(&lport->retry_work); | ||
| 945 | mutex_lock(&lport->lp_mutex); | 922 | mutex_lock(&lport->lp_mutex); |
| 946 | fc_lport_enter_reset(lport); | 923 | fc_lport_enter_reset(lport); |
| 947 | mutex_unlock(&lport->lp_mutex); | 924 | mutex_unlock(&lport->lp_mutex); |
| @@ -950,7 +927,7 @@ int fc_lport_reset(struct fc_lport *lport) | |||
| 950 | EXPORT_SYMBOL(fc_lport_reset); | 927 | EXPORT_SYMBOL(fc_lport_reset); |
| 951 | 928 | ||
| 952 | /** | 929 | /** |
| 953 | * fc_rport_enter_reset - Reset the local port | 930 | * fc_rport_enter_reset() - Reset the local port |
| 954 | * @lport: Fibre Channel local port to be reset | 931 | * @lport: Fibre Channel local port to be reset |
| 955 | * | 932 | * |
| 956 | * Locking Note: The lport lock is expected to be held before calling | 933 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -973,16 +950,16 @@ static void fc_lport_enter_reset(struct fc_lport *lport) | |||
| 973 | 950 | ||
| 974 | lport->tt.disc_stop(lport); | 951 | lport->tt.disc_stop(lport); |
| 975 | 952 | ||
| 976 | lport->tt.exch_mgr_reset(lport->emp, 0, 0); | 953 | lport->tt.exch_mgr_reset(lport, 0, 0); |
| 977 | fc_host_fabric_name(lport->host) = 0; | 954 | fc_host_fabric_name(lport->host) = 0; |
| 978 | fc_host_port_id(lport->host) = 0; | 955 | fc_host_port_id(lport->host) = 0; |
| 979 | 956 | ||
| 980 | if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) | 957 | if (lport->link_up) |
| 981 | fc_lport_enter_flogi(lport); | 958 | fc_lport_enter_flogi(lport); |
| 982 | } | 959 | } |
| 983 | 960 | ||
| 984 | /** | 961 | /** |
| 985 | * fc_lport_error - Handler for any errors | 962 | * fc_lport_error() - Handler for any errors |
| 986 | * @lport: The fc_lport object | 963 | * @lport: The fc_lport object |
| 987 | * @fp: The frame pointer | 964 | * @fp: The frame pointer |
| 988 | * | 965 | * |
| @@ -1029,8 +1006,8 @@ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) | |||
| 1029 | } | 1006 | } |
| 1030 | 1007 | ||
| 1031 | /** | 1008 | /** |
| 1032 | * fc_lport_rft_id_resp - Handle response to Register Fibre | 1009 | * fc_lport_rft_id_resp() - Handle response to Register Fibre |
| 1033 | * Channel Types by ID (RPN_ID) request | 1010 | * Channel Types by ID (RPN_ID) request |
| 1034 | * @sp: current sequence in RPN_ID exchange | 1011 | * @sp: current sequence in RPN_ID exchange |
| 1035 | * @fp: response frame | 1012 | * @fp: response frame |
| 1036 | * @lp_arg: Fibre Channel host port instance | 1013 | * @lp_arg: Fibre Channel host port instance |
| @@ -1053,17 +1030,17 @@ static void fc_lport_rft_id_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 1053 | 1030 | ||
| 1054 | FC_DEBUG_LPORT("Received a RFT_ID response\n"); | 1031 | FC_DEBUG_LPORT("Received a RFT_ID response\n"); |
| 1055 | 1032 | ||
| 1033 | if (IS_ERR(fp)) { | ||
| 1034 | fc_lport_error(lport, fp); | ||
| 1035 | goto err; | ||
| 1036 | } | ||
| 1037 | |||
| 1056 | if (lport->state != LPORT_ST_RFT_ID) { | 1038 | if (lport->state != LPORT_ST_RFT_ID) { |
| 1057 | FC_DBG("Received a RFT_ID response, but in state %s\n", | 1039 | FC_DBG("Received a RFT_ID response, but in state %s\n", |
| 1058 | fc_lport_state(lport)); | 1040 | fc_lport_state(lport)); |
| 1059 | goto out; | 1041 | goto out; |
| 1060 | } | 1042 | } |
| 1061 | 1043 | ||
| 1062 | if (IS_ERR(fp)) { | ||
| 1063 | fc_lport_error(lport, fp); | ||
| 1064 | goto err; | ||
| 1065 | } | ||
| 1066 | |||
| 1067 | fh = fc_frame_header_get(fp); | 1044 | fh = fc_frame_header_get(fp); |
| 1068 | ct = fc_frame_payload_get(fp, sizeof(*ct)); | 1045 | ct = fc_frame_payload_get(fp, sizeof(*ct)); |
| 1069 | 1046 | ||
| @@ -1081,8 +1058,8 @@ err: | |||
| 1081 | } | 1058 | } |
| 1082 | 1059 | ||
| 1083 | /** | 1060 | /** |
| 1084 | * fc_lport_rpn_id_resp - Handle response to Register Port | 1061 | * fc_lport_rpn_id_resp() - Handle response to Register Port |
| 1085 | * Name by ID (RPN_ID) request | 1062 | * Name by ID (RPN_ID) request |
| 1086 | * @sp: current sequence in RPN_ID exchange | 1063 | * @sp: current sequence in RPN_ID exchange |
| 1087 | * @fp: response frame | 1064 | * @fp: response frame |
| 1088 | * @lp_arg: Fibre Channel host port instance | 1065 | * @lp_arg: Fibre Channel host port instance |
| @@ -1105,17 +1082,17 @@ static void fc_lport_rpn_id_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 1105 | 1082 | ||
| 1106 | FC_DEBUG_LPORT("Received a RPN_ID response\n"); | 1083 | FC_DEBUG_LPORT("Received a RPN_ID response\n"); |
| 1107 | 1084 | ||
| 1085 | if (IS_ERR(fp)) { | ||
| 1086 | fc_lport_error(lport, fp); | ||
| 1087 | goto err; | ||
| 1088 | } | ||
| 1089 | |||
| 1108 | if (lport->state != LPORT_ST_RPN_ID) { | 1090 | if (lport->state != LPORT_ST_RPN_ID) { |
| 1109 | FC_DBG("Received a RPN_ID response, but in state %s\n", | 1091 | FC_DBG("Received a RPN_ID response, but in state %s\n", |
| 1110 | fc_lport_state(lport)); | 1092 | fc_lport_state(lport)); |
| 1111 | goto out; | 1093 | goto out; |
| 1112 | } | 1094 | } |
| 1113 | 1095 | ||
| 1114 | if (IS_ERR(fp)) { | ||
| 1115 | fc_lport_error(lport, fp); | ||
| 1116 | goto err; | ||
| 1117 | } | ||
| 1118 | |||
| 1119 | fh = fc_frame_header_get(fp); | 1096 | fh = fc_frame_header_get(fp); |
| 1120 | ct = fc_frame_payload_get(fp, sizeof(*ct)); | 1097 | ct = fc_frame_payload_get(fp, sizeof(*ct)); |
| 1121 | if (fh && ct && fh->fh_type == FC_TYPE_CT && | 1098 | if (fh && ct && fh->fh_type == FC_TYPE_CT && |
| @@ -1133,7 +1110,7 @@ err: | |||
| 1133 | } | 1110 | } |
| 1134 | 1111 | ||
| 1135 | /** | 1112 | /** |
| 1136 | * fc_lport_scr_resp - Handle response to State Change Register (SCR) request | 1113 | * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request |
| 1137 | * @sp: current sequence in SCR exchange | 1114 | * @sp: current sequence in SCR exchange |
| 1138 | * @fp: response frame | 1115 | * @fp: response frame |
| 1139 | * @lp_arg: Fibre Channel lport port instance that sent the registration request | 1116 | * @lp_arg: Fibre Channel lport port instance that sent the registration request |
| @@ -1155,17 +1132,17 @@ static void fc_lport_scr_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 1155 | 1132 | ||
| 1156 | FC_DEBUG_LPORT("Received a SCR response\n"); | 1133 | FC_DEBUG_LPORT("Received a SCR response\n"); |
| 1157 | 1134 | ||
| 1135 | if (IS_ERR(fp)) { | ||
| 1136 | fc_lport_error(lport, fp); | ||
| 1137 | goto err; | ||
| 1138 | } | ||
| 1139 | |||
| 1158 | if (lport->state != LPORT_ST_SCR) { | 1140 | if (lport->state != LPORT_ST_SCR) { |
| 1159 | FC_DBG("Received a SCR response, but in state %s\n", | 1141 | FC_DBG("Received a SCR response, but in state %s\n", |
| 1160 | fc_lport_state(lport)); | 1142 | fc_lport_state(lport)); |
| 1161 | goto out; | 1143 | goto out; |
| 1162 | } | 1144 | } |
| 1163 | 1145 | ||
| 1164 | if (IS_ERR(fp)) { | ||
| 1165 | fc_lport_error(lport, fp); | ||
| 1166 | goto err; | ||
| 1167 | } | ||
| 1168 | |||
| 1169 | op = fc_frame_payload_op(fp); | 1146 | op = fc_frame_payload_op(fp); |
| 1170 | if (op == ELS_LS_ACC) | 1147 | if (op == ELS_LS_ACC) |
| 1171 | fc_lport_enter_ready(lport); | 1148 | fc_lport_enter_ready(lport); |
| @@ -1179,7 +1156,7 @@ err: | |||
| 1179 | } | 1156 | } |
| 1180 | 1157 | ||
| 1181 | /** | 1158 | /** |
| 1182 | * fc_lport_enter_scr - Send a State Change Register (SCR) request | 1159 | * fc_lport_enter_scr() - Send a State Change Register (SCR) request |
| 1183 | * @lport: Fibre Channel local port to register for state changes | 1160 | * @lport: Fibre Channel local port to register for state changes |
| 1184 | * | 1161 | * |
| 1185 | * Locking Note: The lport lock is expected to be held before calling | 1162 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -1206,7 +1183,7 @@ static void fc_lport_enter_scr(struct fc_lport *lport) | |||
| 1206 | } | 1183 | } |
| 1207 | 1184 | ||
| 1208 | /** | 1185 | /** |
| 1209 | * fc_lport_enter_rft_id - Register FC4-types with the name server | 1186 | * fc_lport_enter_rft_id() - Register FC4-types with the name server |
| 1210 | * @lport: Fibre Channel local port to register | 1187 | * @lport: Fibre Channel local port to register |
| 1211 | * | 1188 | * |
| 1212 | * Locking Note: The lport lock is expected to be held before calling | 1189 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -1248,7 +1225,7 @@ static void fc_lport_enter_rft_id(struct fc_lport *lport) | |||
| 1248 | } | 1225 | } |
| 1249 | 1226 | ||
| 1250 | /** | 1227 | /** |
| 1251 | * fc_rport_enter_rft_id - Register port name with the name server | 1228 | * fc_rport_enter_rft_id() - Register port name with the name server |
| 1252 | * @lport: Fibre Channel local port to register | 1229 | * @lport: Fibre Channel local port to register |
| 1253 | * | 1230 | * |
| 1254 | * Locking Note: The lport lock is expected to be held before calling | 1231 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -1281,7 +1258,7 @@ static struct fc_rport_operations fc_lport_rport_ops = { | |||
| 1281 | }; | 1258 | }; |
| 1282 | 1259 | ||
| 1283 | /** | 1260 | /** |
| 1284 | * fc_rport_enter_dns - Create a rport to the name server | 1261 | * fc_rport_enter_dns() - Create a rport to the name server |
| 1285 | * @lport: Fibre Channel local port requesting a rport for the name server | 1262 | * @lport: Fibre Channel local port requesting a rport for the name server |
| 1286 | * | 1263 | * |
| 1287 | * Locking Note: The lport lock is expected to be held before calling | 1264 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -1304,7 +1281,7 @@ static void fc_lport_enter_dns(struct fc_lport *lport) | |||
| 1304 | 1281 | ||
| 1305 | fc_lport_state_enter(lport, LPORT_ST_DNS); | 1282 | fc_lport_state_enter(lport, LPORT_ST_DNS); |
| 1306 | 1283 | ||
| 1307 | rport = fc_rport_rogue_create(&dp); | 1284 | rport = lport->tt.rport_create(&dp); |
| 1308 | if (!rport) | 1285 | if (!rport) |
| 1309 | goto err; | 1286 | goto err; |
| 1310 | 1287 | ||
| @@ -1318,7 +1295,7 @@ err: | |||
| 1318 | } | 1295 | } |
| 1319 | 1296 | ||
| 1320 | /** | 1297 | /** |
| 1321 | * fc_lport_timeout - Handler for the retry_work timer. | 1298 | * fc_lport_timeout() - Handler for the retry_work timer. |
| 1322 | * @work: The work struct of the fc_lport | 1299 | * @work: The work struct of the fc_lport |
| 1323 | */ | 1300 | */ |
| 1324 | static void fc_lport_timeout(struct work_struct *work) | 1301 | static void fc_lport_timeout(struct work_struct *work) |
| @@ -1359,7 +1336,7 @@ static void fc_lport_timeout(struct work_struct *work) | |||
| 1359 | } | 1336 | } |
| 1360 | 1337 | ||
| 1361 | /** | 1338 | /** |
| 1362 | * fc_lport_logo_resp - Handle response to LOGO request | 1339 | * fc_lport_logo_resp() - Handle response to LOGO request |
| 1363 | * @sp: current sequence in LOGO exchange | 1340 | * @sp: current sequence in LOGO exchange |
| 1364 | * @fp: response frame | 1341 | * @fp: response frame |
| 1365 | * @lp_arg: Fibre Channel lport port instance that sent the LOGO request | 1342 | * @lp_arg: Fibre Channel lport port instance that sent the LOGO request |
| @@ -1381,17 +1358,17 @@ static void fc_lport_logo_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 1381 | 1358 | ||
| 1382 | FC_DEBUG_LPORT("Received a LOGO response\n"); | 1359 | FC_DEBUG_LPORT("Received a LOGO response\n"); |
| 1383 | 1360 | ||
| 1361 | if (IS_ERR(fp)) { | ||
| 1362 | fc_lport_error(lport, fp); | ||
| 1363 | goto err; | ||
| 1364 | } | ||
| 1365 | |||
| 1384 | if (lport->state != LPORT_ST_LOGO) { | 1366 | if (lport->state != LPORT_ST_LOGO) { |
| 1385 | FC_DBG("Received a LOGO response, but in state %s\n", | 1367 | FC_DBG("Received a LOGO response, but in state %s\n", |
| 1386 | fc_lport_state(lport)); | 1368 | fc_lport_state(lport)); |
| 1387 | goto out; | 1369 | goto out; |
| 1388 | } | 1370 | } |
| 1389 | 1371 | ||
| 1390 | if (IS_ERR(fp)) { | ||
| 1391 | fc_lport_error(lport, fp); | ||
| 1392 | goto err; | ||
| 1393 | } | ||
| 1394 | |||
| 1395 | op = fc_frame_payload_op(fp); | 1372 | op = fc_frame_payload_op(fp); |
| 1396 | if (op == ELS_LS_ACC) | 1373 | if (op == ELS_LS_ACC) |
| 1397 | fc_lport_enter_reset(lport); | 1374 | fc_lport_enter_reset(lport); |
| @@ -1405,7 +1382,7 @@ err: | |||
| 1405 | } | 1382 | } |
| 1406 | 1383 | ||
| 1407 | /** | 1384 | /** |
| 1408 | * fc_rport_enter_logo - Logout of the fabric | 1385 | * fc_rport_enter_logo() - Logout of the fabric |
| 1409 | * @lport: Fibre Channel local port to be logged out | 1386 | * @lport: Fibre Channel local port to be logged out |
| 1410 | * | 1387 | * |
| 1411 | * Locking Note: The lport lock is expected to be held before calling | 1388 | * Locking Note: The lport lock is expected to be held before calling |
| @@ -1437,7 +1414,7 @@ static void fc_lport_enter_logo(struct fc_lport *lport) | |||
| 1437 | } | 1414 | } |
| 1438 | 1415 | ||
| 1439 | /** | 1416 | /** |
| 1440 | * fc_lport_flogi_resp - Handle response to FLOGI request | 1417 | * fc_lport_flogi_resp() - Handle response to FLOGI request |
| 1441 | * @sp: current sequence in FLOGI exchange | 1418 | * @sp: current sequence in FLOGI exchange |
| 1442 | * @fp: response frame | 1419 | * @fp: response frame |
| 1443 | * @lp_arg: Fibre Channel lport port instance that sent the FLOGI request | 1420 | * @lp_arg: Fibre Channel lport port instance that sent the FLOGI request |
| @@ -1465,17 +1442,17 @@ static void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 1465 | 1442 | ||
| 1466 | FC_DEBUG_LPORT("Received a FLOGI response\n"); | 1443 | FC_DEBUG_LPORT("Received a FLOGI response\n"); |
| 1467 | 1444 | ||
| 1445 | if (IS_ERR(fp)) { | ||
| 1446 | fc_lport_error(lport, fp); | ||
| 1447 | goto err; | ||
| 1448 | } | ||
| 1449 | |||
| 1468 | if (lport->state != LPORT_ST_FLOGI) { | 1450 | if (lport->state != LPORT_ST_FLOGI) { |
| 1469 | FC_DBG("Received a FLOGI response, but in state %s\n", | 1451 | FC_DBG("Received a FLOGI response, but in state %s\n", |
| 1470 | fc_lport_state(lport)); | 1452 | fc_lport_state(lport)); |
| 1471 | goto out; | 1453 | goto out; |
| 1472 | } | 1454 | } |
| 1473 | 1455 | ||
| 1474 | if (IS_ERR(fp)) { | ||
| 1475 | fc_lport_error(lport, fp); | ||
| 1476 | goto err; | ||
| 1477 | } | ||
| 1478 | |||
| 1479 | fh = fc_frame_header_get(fp); | 1456 | fh = fc_frame_header_get(fp); |
| 1480 | did = ntoh24(fh->fh_d_id); | 1457 | did = ntoh24(fh->fh_d_id); |
| 1481 | if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) { | 1458 | if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) { |
| @@ -1532,7 +1509,7 @@ err: | |||
| 1532 | } | 1509 | } |
| 1533 | 1510 | ||
| 1534 | /** | 1511 | /** |
| 1535 | * fc_rport_enter_flogi - Send a FLOGI request to the fabric manager | 1512 | * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager |
| 1536 | * @lport: Fibre Channel local port to be logged in to the fabric | 1513 | * @lport: Fibre Channel local port to be logged in to the fabric |
| 1537 | * | 1514 | * |
| 1538 | * Locking Note: The lport lock is expected to be held before calling | 1515 | * Locking Note: The lport lock is expected to be held before calling |
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index e780d8caf70..dae65133a83 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c | |||
| @@ -81,6 +81,7 @@ static void fc_rport_recv_logo_req(struct fc_rport *, | |||
| 81 | struct fc_seq *, struct fc_frame *); | 81 | struct fc_seq *, struct fc_frame *); |
| 82 | static void fc_rport_timeout(struct work_struct *); | 82 | static void fc_rport_timeout(struct work_struct *); |
| 83 | static void fc_rport_error(struct fc_rport *, struct fc_frame *); | 83 | static void fc_rport_error(struct fc_rport *, struct fc_frame *); |
| 84 | static void fc_rport_error_retry(struct fc_rport *, struct fc_frame *); | ||
| 84 | static void fc_rport_work(struct work_struct *); | 85 | static void fc_rport_work(struct work_struct *); |
| 85 | 86 | ||
| 86 | static const char *fc_rport_state_names[] = { | 87 | static const char *fc_rport_state_names[] = { |
| @@ -145,7 +146,7 @@ struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp) | |||
| 145 | } | 146 | } |
| 146 | 147 | ||
| 147 | /** | 148 | /** |
| 148 | * fc_rport_state - return a string for the state the rport is in | 149 | * fc_rport_state() - return a string for the state the rport is in |
| 149 | * @rport: The rport whose state we want to get a string for | 150 | * @rport: The rport whose state we want to get a string for |
| 150 | */ | 151 | */ |
| 151 | static const char *fc_rport_state(struct fc_rport *rport) | 152 | static const char *fc_rport_state(struct fc_rport *rport) |
| @@ -160,7 +161,7 @@ static const char *fc_rport_state(struct fc_rport *rport) | |||
| 160 | } | 161 | } |
| 161 | 162 | ||
| 162 | /** | 163 | /** |
| 163 | * fc_set_rport_loss_tmo - Set the remote port loss timeout in seconds. | 164 | * fc_set_rport_loss_tmo() - Set the remote port loss timeout in seconds. |
| 164 | * @rport: Pointer to Fibre Channel remote port structure | 165 | * @rport: Pointer to Fibre Channel remote port structure |
| 165 | * @timeout: timeout in seconds | 166 | * @timeout: timeout in seconds |
| 166 | */ | 167 | */ |
| @@ -174,12 +175,12 @@ void fc_set_rport_loss_tmo(struct fc_rport *rport, u32 timeout) | |||
| 174 | EXPORT_SYMBOL(fc_set_rport_loss_tmo); | 175 | EXPORT_SYMBOL(fc_set_rport_loss_tmo); |
| 175 | 176 | ||
| 176 | /** | 177 | /** |
| 177 | * fc_plogi_get_maxframe - Get max payload from the common service parameters | 178 | * fc_plogi_get_maxframe() - Get max payload from the common service parameters |
| 178 | * @flp: FLOGI payload structure | 179 | * @flp: FLOGI payload structure |
| 179 | * @maxval: upper limit, may be less than what is in the service parameters | 180 | * @maxval: upper limit, may be less than what is in the service parameters |
| 180 | */ | 181 | */ |
| 181 | static unsigned int | 182 | static unsigned int fc_plogi_get_maxframe(struct fc_els_flogi *flp, |
| 182 | fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval) | 183 | unsigned int maxval) |
| 183 | { | 184 | { |
| 184 | unsigned int mfs; | 185 | unsigned int mfs; |
| 185 | 186 | ||
| @@ -197,7 +198,7 @@ fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval) | |||
| 197 | } | 198 | } |
| 198 | 199 | ||
| 199 | /** | 200 | /** |
| 200 | * fc_rport_state_enter - Change the rport's state | 201 | * fc_rport_state_enter() - Change the rport's state |
| 201 | * @rport: The rport whose state should change | 202 | * @rport: The rport whose state should change |
| 202 | * @new: The new state of the rport | 203 | * @new: The new state of the rport |
| 203 | * | 204 | * |
| @@ -214,6 +215,7 @@ static void fc_rport_state_enter(struct fc_rport *rport, | |||
| 214 | 215 | ||
| 215 | static void fc_rport_work(struct work_struct *work) | 216 | static void fc_rport_work(struct work_struct *work) |
| 216 | { | 217 | { |
| 218 | u32 port_id; | ||
| 217 | struct fc_rport_libfc_priv *rdata = | 219 | struct fc_rport_libfc_priv *rdata = |
| 218 | container_of(work, struct fc_rport_libfc_priv, event_work); | 220 | container_of(work, struct fc_rport_libfc_priv, event_work); |
| 219 | enum fc_rport_event event; | 221 | enum fc_rport_event event; |
| @@ -279,14 +281,18 @@ static void fc_rport_work(struct work_struct *work) | |||
| 279 | rport_ops->event_callback(lport, rport, event); | 281 | rport_ops->event_callback(lport, rport, event); |
| 280 | if (trans_state == FC_PORTSTATE_ROGUE) | 282 | if (trans_state == FC_PORTSTATE_ROGUE) |
| 281 | put_device(&rport->dev); | 283 | put_device(&rport->dev); |
| 282 | else | 284 | else { |
| 285 | port_id = rport->port_id; | ||
| 283 | fc_remote_port_delete(rport); | 286 | fc_remote_port_delete(rport); |
| 287 | lport->tt.exch_mgr_reset(lport, 0, port_id); | ||
| 288 | lport->tt.exch_mgr_reset(lport, port_id, 0); | ||
| 289 | } | ||
| 284 | } else | 290 | } else |
| 285 | mutex_unlock(&rdata->rp_mutex); | 291 | mutex_unlock(&rdata->rp_mutex); |
| 286 | } | 292 | } |
| 287 | 293 | ||
| 288 | /** | 294 | /** |
| 289 | * fc_rport_login - Start the remote port login state machine | 295 | * fc_rport_login() - Start the remote port login state machine |
| 290 | * @rport: Fibre Channel remote port | 296 | * @rport: Fibre Channel remote port |
| 291 | * | 297 | * |
| 292 | * Locking Note: Called without the rport lock held. This | 298 | * Locking Note: Called without the rport lock held. This |
| @@ -309,7 +315,7 @@ int fc_rport_login(struct fc_rport *rport) | |||
| 309 | } | 315 | } |
| 310 | 316 | ||
| 311 | /** | 317 | /** |
| 312 | * fc_rport_logoff - Logoff and remove an rport | 318 | * fc_rport_logoff() - Logoff and remove an rport |
| 313 | * @rport: Fibre Channel remote port to be removed | 319 | * @rport: Fibre Channel remote port to be removed |
| 314 | * | 320 | * |
| 315 | * Locking Note: Called without the rport lock held. This | 321 | * Locking Note: Called without the rport lock held. This |
| @@ -347,7 +353,7 @@ int fc_rport_logoff(struct fc_rport *rport) | |||
| 347 | } | 353 | } |
| 348 | 354 | ||
| 349 | /** | 355 | /** |
| 350 | * fc_rport_enter_ready - The rport is ready | 356 | * fc_rport_enter_ready() - The rport is ready |
| 351 | * @rport: Fibre Channel remote port that is ready | 357 | * @rport: Fibre Channel remote port that is ready |
| 352 | * | 358 | * |
| 353 | * Locking Note: The rport lock is expected to be held before calling | 359 | * Locking Note: The rport lock is expected to be held before calling |
| @@ -366,7 +372,7 @@ static void fc_rport_enter_ready(struct fc_rport *rport) | |||
| 366 | } | 372 | } |
| 367 | 373 | ||
| 368 | /** | 374 | /** |
| 369 | * fc_rport_timeout - Handler for the retry_work timer. | 375 | * fc_rport_timeout() - Handler for the retry_work timer. |
| 370 | * @work: The work struct of the fc_rport_libfc_priv | 376 | * @work: The work struct of the fc_rport_libfc_priv |
| 371 | * | 377 | * |
| 372 | * Locking Note: Called without the rport lock held. This | 378 | * Locking Note: Called without the rport lock held. This |
| @@ -405,59 +411,75 @@ static void fc_rport_timeout(struct work_struct *work) | |||
| 405 | } | 411 | } |
| 406 | 412 | ||
| 407 | /** | 413 | /** |
| 408 | * fc_rport_error - Handler for any errors | 414 | * fc_rport_error() - Error handler, called once retries have been exhausted |
| 409 | * @rport: The fc_rport object | 415 | * @rport: The fc_rport object |
| 410 | * @fp: The frame pointer | 416 | * @fp: The frame pointer |
| 411 | * | 417 | * |
| 412 | * If the error was caused by a resource allocation failure | ||
| 413 | * then wait for half a second and retry, otherwise retry | ||
| 414 | * immediately. | ||
| 415 | * | ||
| 416 | * Locking Note: The rport lock is expected to be held before | 418 | * Locking Note: The rport lock is expected to be held before |
| 417 | * calling this routine | 419 | * calling this routine |
| 418 | */ | 420 | */ |
| 419 | static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp) | 421 | static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp) |
| 420 | { | 422 | { |
| 421 | struct fc_rport_libfc_priv *rdata = rport->dd_data; | 423 | struct fc_rport_libfc_priv *rdata = rport->dd_data; |
| 422 | unsigned long delay = 0; | ||
| 423 | 424 | ||
| 424 | FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n", | 425 | FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n", |
| 425 | PTR_ERR(fp), fc_rport_state(rport), rdata->retries); | 426 | PTR_ERR(fp), fc_rport_state(rport), rdata->retries); |
| 426 | 427 | ||
| 427 | if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) { | 428 | switch (rdata->rp_state) { |
| 428 | /* | 429 | case RPORT_ST_PLOGI: |
| 429 | * Memory allocation failure, or the exchange timed out. | 430 | case RPORT_ST_PRLI: |
| 430 | * Retry after delay | 431 | case RPORT_ST_LOGO: |
| 431 | */ | 432 | rdata->event = RPORT_EV_FAILED; |
| 432 | if (rdata->retries < rdata->local_port->max_retry_count) { | 433 | queue_work(rport_event_queue, |
| 433 | rdata->retries++; | 434 | &rdata->event_work); |
| 434 | if (!fp) | 435 | break; |
| 435 | delay = msecs_to_jiffies(500); | 436 | case RPORT_ST_RTV: |
| 436 | get_device(&rport->dev); | 437 | fc_rport_enter_ready(rport); |
| 437 | schedule_delayed_work(&rdata->retry_work, delay); | 438 | break; |
| 438 | } else { | 439 | case RPORT_ST_NONE: |
| 439 | switch (rdata->rp_state) { | 440 | case RPORT_ST_READY: |
| 440 | case RPORT_ST_PLOGI: | 441 | case RPORT_ST_INIT: |
| 441 | case RPORT_ST_PRLI: | 442 | break; |
| 442 | case RPORT_ST_LOGO: | ||
| 443 | rdata->event = RPORT_EV_FAILED; | ||
| 444 | queue_work(rport_event_queue, | ||
| 445 | &rdata->event_work); | ||
| 446 | break; | ||
| 447 | case RPORT_ST_RTV: | ||
| 448 | fc_rport_enter_ready(rport); | ||
| 449 | break; | ||
| 450 | case RPORT_ST_NONE: | ||
| 451 | case RPORT_ST_READY: | ||
| 452 | case RPORT_ST_INIT: | ||
| 453 | break; | ||
| 454 | } | ||
| 455 | } | ||
| 456 | } | 443 | } |
| 457 | } | 444 | } |
| 458 | 445 | ||
| 459 | /** | 446 | /** |
| 460 | * fc_rport_plogi_recv_resp - Handle incoming ELS PLOGI response | 447 | * fc_rport_error_retry() - Error handler when retries are desired |
| 448 | * @rport: The fc_rport object | ||
| 449 | * @fp: The frame pointer | ||
| 450 | * | ||
| 451 | * If the error was an exchange timeout retry immediately, | ||
| 452 | * otherwise wait for E_D_TOV. | ||
| 453 | * | ||
| 454 | * Locking Note: The rport lock is expected to be held before | ||
| 455 | * calling this routine | ||
| 456 | */ | ||
| 457 | static void fc_rport_error_retry(struct fc_rport *rport, struct fc_frame *fp) | ||
| 458 | { | ||
| 459 | struct fc_rport_libfc_priv *rdata = rport->dd_data; | ||
| 460 | unsigned long delay = FC_DEF_E_D_TOV; | ||
| 461 | |||
| 462 | /* make sure this isn't an FC_EX_CLOSED error, never retry those */ | ||
| 463 | if (PTR_ERR(fp) == -FC_EX_CLOSED) | ||
| 464 | return fc_rport_error(rport, fp); | ||
| 465 | |||
| 466 | if (rdata->retries < rdata->local_port->max_retry_count) { | ||
| 467 | FC_DEBUG_RPORT("Error %ld in state %s, retrying\n", | ||
| 468 | PTR_ERR(fp), fc_rport_state(rport)); | ||
| 469 | rdata->retries++; | ||
| 470 | /* no additional delay on exchange timeouts */ | ||
| 471 | if (PTR_ERR(fp) == -FC_EX_TIMEOUT) | ||
| 472 | delay = 0; | ||
| 473 | get_device(&rport->dev); | ||
| 474 | schedule_delayed_work(&rdata->retry_work, delay); | ||
| 475 | return; | ||
| 476 | } | ||
| 477 | |||
| 478 | return fc_rport_error(rport, fp); | ||
| 479 | } | ||
| 480 | |||
| 481 | /** | ||
| 482 | * fc_rport_plogi_recv_resp() - Handle incoming ELS PLOGI response | ||
| 461 | * @sp: current sequence in the PLOGI exchange | 483 | * @sp: current sequence in the PLOGI exchange |
| 462 | * @fp: response frame | 484 | * @fp: response frame |
| 463 | * @rp_arg: Fibre Channel remote port | 485 | * @rp_arg: Fibre Channel remote port |
| @@ -483,17 +505,17 @@ static void fc_rport_plogi_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 483 | FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n", | 505 | FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n", |
| 484 | rport->port_id); | 506 | rport->port_id); |
| 485 | 507 | ||
| 508 | if (IS_ERR(fp)) { | ||
| 509 | fc_rport_error_retry(rport, fp); | ||
| 510 | goto err; | ||
| 511 | } | ||
| 512 | |||
| 486 | if (rdata->rp_state != RPORT_ST_PLOGI) { | 513 | if (rdata->rp_state != RPORT_ST_PLOGI) { |
| 487 | FC_DBG("Received a PLOGI response, but in state %s\n", | 514 | FC_DBG("Received a PLOGI response, but in state %s\n", |
| 488 | fc_rport_state(rport)); | 515 | fc_rport_state(rport)); |
| 489 | goto out; | 516 | goto out; |
| 490 | } | 517 | } |
| 491 | 518 | ||
| 492 | if (IS_ERR(fp)) { | ||
| 493 | fc_rport_error(rport, fp); | ||
| 494 | goto err; | ||
| 495 | } | ||
| 496 | |||
| 497 | op = fc_frame_payload_op(fp); | 519 | op = fc_frame_payload_op(fp); |
| 498 | if (op == ELS_LS_ACC && | 520 | if (op == ELS_LS_ACC && |
| 499 | (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) { | 521 | (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) { |
| @@ -522,7 +544,7 @@ static void fc_rport_plogi_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 522 | else | 544 | else |
| 523 | fc_rport_enter_prli(rport); | 545 | fc_rport_enter_prli(rport); |
| 524 | } else | 546 | } else |
| 525 | fc_rport_error(rport, fp); | 547 | fc_rport_error_retry(rport, fp); |
| 526 | 548 | ||
| 527 | out: | 549 | out: |
| 528 | fc_frame_free(fp); | 550 | fc_frame_free(fp); |
| @@ -532,7 +554,7 @@ err: | |||
| 532 | } | 554 | } |
| 533 | 555 | ||
| 534 | /** | 556 | /** |
| 535 | * fc_rport_enter_plogi - Send Port Login (PLOGI) request to peer | 557 | * fc_rport_enter_plogi() - Send Port Login (PLOGI) request to peer |
| 536 | * @rport: Fibre Channel remote port to send PLOGI to | 558 | * @rport: Fibre Channel remote port to send PLOGI to |
| 537 | * | 559 | * |
| 538 | * Locking Note: The rport lock is expected to be held before calling | 560 | * Locking Note: The rport lock is expected to be held before calling |
| @@ -552,20 +574,20 @@ static void fc_rport_enter_plogi(struct fc_rport *rport) | |||
| 552 | rport->maxframe_size = FC_MIN_MAX_PAYLOAD; | 574 | rport->maxframe_size = FC_MIN_MAX_PAYLOAD; |
| 553 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi)); | 575 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi)); |
| 554 | if (!fp) { | 576 | if (!fp) { |
| 555 | fc_rport_error(rport, fp); | 577 | fc_rport_error_retry(rport, fp); |
| 556 | return; | 578 | return; |
| 557 | } | 579 | } |
| 558 | rdata->e_d_tov = lport->e_d_tov; | 580 | rdata->e_d_tov = lport->e_d_tov; |
| 559 | 581 | ||
| 560 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI, | 582 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI, |
| 561 | fc_rport_plogi_resp, rport, lport->e_d_tov)) | 583 | fc_rport_plogi_resp, rport, lport->e_d_tov)) |
| 562 | fc_rport_error(rport, fp); | 584 | fc_rport_error_retry(rport, fp); |
| 563 | else | 585 | else |
| 564 | get_device(&rport->dev); | 586 | get_device(&rport->dev); |
| 565 | } | 587 | } |
| 566 | 588 | ||
| 567 | /** | 589 | /** |
| 568 | * fc_rport_prli_resp - Process Login (PRLI) response handler | 590 | * fc_rport_prli_resp() - Process Login (PRLI) response handler |
| 569 | * @sp: current sequence in the PRLI exchange | 591 | * @sp: current sequence in the PRLI exchange |
| 570 | * @fp: response frame | 592 | * @fp: response frame |
| 571 | * @rp_arg: Fibre Channel remote port | 593 | * @rp_arg: Fibre Channel remote port |
| @@ -592,17 +614,17 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 592 | FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n", | 614 | FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n", |
| 593 | rport->port_id); | 615 | rport->port_id); |
| 594 | 616 | ||
| 617 | if (IS_ERR(fp)) { | ||
| 618 | fc_rport_error_retry(rport, fp); | ||
| 619 | goto err; | ||
| 620 | } | ||
| 621 | |||
| 595 | if (rdata->rp_state != RPORT_ST_PRLI) { | 622 | if (rdata->rp_state != RPORT_ST_PRLI) { |
| 596 | FC_DBG("Received a PRLI response, but in state %s\n", | 623 | FC_DBG("Received a PRLI response, but in state %s\n", |
| 597 | fc_rport_state(rport)); | 624 | fc_rport_state(rport)); |
| 598 | goto out; | 625 | goto out; |
| 599 | } | 626 | } |
| 600 | 627 | ||
| 601 | if (IS_ERR(fp)) { | ||
| 602 | fc_rport_error(rport, fp); | ||
| 603 | goto err; | ||
| 604 | } | ||
| 605 | |||
| 606 | op = fc_frame_payload_op(fp); | 628 | op = fc_frame_payload_op(fp); |
| 607 | if (op == ELS_LS_ACC) { | 629 | if (op == ELS_LS_ACC) { |
| 608 | pp = fc_frame_payload_get(fp, sizeof(*pp)); | 630 | pp = fc_frame_payload_get(fp, sizeof(*pp)); |
| @@ -635,7 +657,7 @@ err: | |||
| 635 | } | 657 | } |
| 636 | 658 | ||
| 637 | /** | 659 | /** |
| 638 | * fc_rport_logo_resp - Logout (LOGO) response handler | 660 | * fc_rport_logo_resp() - Logout (LOGO) response handler |
| 639 | * @sp: current sequence in the LOGO exchange | 661 | * @sp: current sequence in the LOGO exchange |
| 640 | * @fp: response frame | 662 | * @fp: response frame |
| 641 | * @rp_arg: Fibre Channel remote port | 663 | * @rp_arg: Fibre Channel remote port |
| @@ -657,7 +679,7 @@ static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 657 | rport->port_id); | 679 | rport->port_id); |
| 658 | 680 | ||
| 659 | if (IS_ERR(fp)) { | 681 | if (IS_ERR(fp)) { |
| 660 | fc_rport_error(rport, fp); | 682 | fc_rport_error_retry(rport, fp); |
| 661 | goto err; | 683 | goto err; |
| 662 | } | 684 | } |
| 663 | 685 | ||
| @@ -684,7 +706,7 @@ err: | |||
| 684 | } | 706 | } |
| 685 | 707 | ||
| 686 | /** | 708 | /** |
| 687 | * fc_rport_enter_prli - Send Process Login (PRLI) request to peer | 709 | * fc_rport_enter_prli() - Send Process Login (PRLI) request to peer |
| 688 | * @rport: Fibre Channel remote port to send PRLI to | 710 | * @rport: Fibre Channel remote port to send PRLI to |
| 689 | * | 711 | * |
| 690 | * Locking Note: The rport lock is expected to be held before calling | 712 | * Locking Note: The rport lock is expected to be held before calling |
| @@ -707,19 +729,19 @@ static void fc_rport_enter_prli(struct fc_rport *rport) | |||
| 707 | 729 | ||
| 708 | fp = fc_frame_alloc(lport, sizeof(*pp)); | 730 | fp = fc_frame_alloc(lport, sizeof(*pp)); |
| 709 | if (!fp) { | 731 | if (!fp) { |
| 710 | fc_rport_error(rport, fp); | 732 | fc_rport_error_retry(rport, fp); |
| 711 | return; | 733 | return; |
| 712 | } | 734 | } |
| 713 | 735 | ||
| 714 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI, | 736 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI, |
| 715 | fc_rport_prli_resp, rport, lport->e_d_tov)) | 737 | fc_rport_prli_resp, rport, lport->e_d_tov)) |
| 716 | fc_rport_error(rport, fp); | 738 | fc_rport_error_retry(rport, fp); |
| 717 | else | 739 | else |
| 718 | get_device(&rport->dev); | 740 | get_device(&rport->dev); |
| 719 | } | 741 | } |
| 720 | 742 | ||
| 721 | /** | 743 | /** |
| 722 | * fc_rport_els_rtv_resp - Request Timeout Value response handler | 744 | * fc_rport_els_rtv_resp() - Request Timeout Value response handler |
| 723 | * @sp: current sequence in the RTV exchange | 745 | * @sp: current sequence in the RTV exchange |
| 724 | * @fp: response frame | 746 | * @fp: response frame |
| 725 | * @rp_arg: Fibre Channel remote port | 747 | * @rp_arg: Fibre Channel remote port |
| @@ -742,17 +764,17 @@ static void fc_rport_rtv_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
| 742 | FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n", | 764 | FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n", |
| 743 | rport->port_id); | 765 | rport->port_id); |
| 744 | 766 | ||
| 767 | if (IS_ERR(fp)) { | ||
| 768 | fc_rport_error(rport, fp); | ||
| 769 | goto err; | ||
| 770 | } | ||
| 771 | |||
| 745 | if (rdata->rp_state != RPORT_ST_RTV) { | 772 | if (rdata->rp_state != RPORT_ST_RTV) { |
| 746 | FC_DBG("Received a RTV response, but in state %s\n", | 773 | FC_DBG("Received a RTV response, but in state %s\n", |
| 747 | fc_rport_state(rport)); | 774 | fc_rport_state(rport)); |
| 748 | goto out; | 775 | goto out; |
| 749 | } | 776 | } |
| 750 | 777 | ||
| 751 | if (IS_ERR(fp)) { | ||
| 752 | fc_rport_error(rport, fp); | ||
| 753 | goto err; | ||
| 754 | } | ||
| 755 | |||
| 756 | op = fc_frame_payload_op(fp); | 778 | op = fc_frame_payload_op(fp); |
| 757 | if (op == ELS_LS_ACC) { | 779 | if (op == ELS_LS_ACC) { |
| 758 | struct fc_els_rtv_acc *rtv; | 780 | struct fc_els_rtv_acc *rtv; |
| @@ -785,7 +807,7 @@ err: | |||
| 785 | } | 807 | } |
| 786 | 808 | ||
| 787 | /** | 809 | /** |
| 788 | * fc_rport_enter_rtv - Send Request Timeout Value (RTV) request to peer | 810 | * fc_rport_enter_rtv() - Send Request Timeout Value (RTV) request to peer |
| 789 | * @rport: Fibre Channel remote port to send RTV to | 811 | * @rport: Fibre Channel remote port to send RTV to |
| 790 | * | 812 | * |
| 791 | * Locking Note: The rport lock is expected to be held before calling | 813 | * Locking Note: The rport lock is expected to be held before calling |
| @@ -804,19 +826,19 @@ static void fc_rport_enter_rtv(struct fc_rport *rport) | |||
| 804 | 826 | ||
| 805 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv)); | 827 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv)); |
| 806 | if (!fp) { | 828 | if (!fp) { |
| 807 | fc_rport_error(rport, fp); | 829 | fc_rport_error_retry(rport, fp); |
| 808 | return; | 830 | return; |
| 809 | } | 831 | } |
| 810 | 832 | ||
| 811 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV, | 833 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV, |
| 812 | fc_rport_rtv_resp, rport, lport->e_d_tov)) | 834 | fc_rport_rtv_resp, rport, lport->e_d_tov)) |
| 813 | fc_rport_error(rport, fp); | 835 | fc_rport_error_retry(rport, fp); |
| 814 | else | 836 | else |
| 815 | get_device(&rport->dev); | 837 | get_device(&rport->dev); |
| 816 | } | 838 | } |
| 817 | 839 | ||
| 818 | /** | 840 | /** |
| 819 | * fc_rport_enter_logo - Send Logout (LOGO) request to peer | 841 | * fc_rport_enter_logo() - Send Logout (LOGO) request to peer |
| 820 | * @rport: Fibre Channel remote port to send LOGO to | 842 | * @rport: Fibre Channel remote port to send LOGO to |
| 821 | * | 843 | * |
| 822 | * Locking Note: The rport lock is expected to be held before calling | 844 | * Locking Note: The rport lock is expected to be held before calling |
| @@ -835,20 +857,20 @@ static void fc_rport_enter_logo(struct fc_rport *rport) | |||
| 835 | 857 | ||
| 836 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo)); | 858 | fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo)); |
| 837 | if (!fp) { | 859 | if (!fp) { |
| 838 | fc_rport_error(rport, fp); | 860 | fc_rport_error_retry(rport, fp); |
| 839 | return; | 861 | return; |
| 840 | } | 862 | } |
| 841 | 863 | ||
| 842 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO, | 864 | if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO, |
| 843 | fc_rport_logo_resp, rport, lport->e_d_tov)) | 865 | fc_rport_logo_resp, rport, lport->e_d_tov)) |
| 844 | fc_rport_error(rport, fp); | 866 | fc_rport_error_retry(rport, fp); |
| 845 | else | 867 | else |
| 846 | get_device(&rport->dev); | 868 | get_device(&rport->dev); |
| 847 | } | 869 | } |
| 848 | 870 | ||
| 849 | 871 | ||
| 850 | /** | 872 | /** |
| 851 | * fc_rport_recv_req - Receive a request from a rport | 873 | * fc_rport_recv_req() - Receive a request from a rport |
| 852 | * @sp: current sequence in the PLOGI exchange | 874 | * @sp: current sequence in the PLOGI exchange |
| 853 | * @fp: response frame | 875 | * @fp: response frame |
| 854 | * @rp_arg: Fibre Channel remote port | 876 | * @rp_arg: Fibre Channel remote port |
| @@ -909,7 +931,7 @@ void fc_rport_recv_req(struct fc_seq *sp, struct fc_frame *fp, | |||
| 909 | } | 931 | } |
| 910 | 932 | ||
| 911 | /** | 933 | /** |
| 912 | * fc_rport_recv_plogi_req - Handle incoming Port Login (PLOGI) request | 934 | * fc_rport_recv_plogi_req() - Handle incoming Port Login (PLOGI) request |
| 913 | * @rport: Fibre Channel remote port that initiated PLOGI | 935 | * @rport: Fibre Channel remote port that initiated PLOGI |
| 914 | * @sp: current sequence in the PLOGI exchange | 936 | * @sp: current sequence in the PLOGI exchange |
| 915 | * @fp: PLOGI request frame | 937 | * @fp: PLOGI request frame |
| @@ -1031,7 +1053,7 @@ static void fc_rport_recv_plogi_req(struct fc_rport *rport, | |||
| 1031 | } | 1053 | } |
| 1032 | 1054 | ||
| 1033 | /** | 1055 | /** |
| 1034 | * fc_rport_recv_prli_req - Handle incoming Process Login (PRLI) request | 1056 | * fc_rport_recv_prli_req() - Handle incoming Process Login (PRLI) request |
| 1035 | * @rport: Fibre Channel remote port that initiated PRLI | 1057 | * @rport: Fibre Channel remote port that initiated PRLI |
| 1036 | * @sp: current sequence in the PRLI exchange | 1058 | * @sp: current sequence in the PRLI exchange |
| 1037 | * @fp: PRLI request frame | 1059 | * @fp: PRLI request frame |
| @@ -1182,7 +1204,7 @@ static void fc_rport_recv_prli_req(struct fc_rport *rport, | |||
| 1182 | } | 1204 | } |
| 1183 | 1205 | ||
| 1184 | /** | 1206 | /** |
| 1185 | * fc_rport_recv_prlo_req - Handle incoming Process Logout (PRLO) request | 1207 | * fc_rport_recv_prlo_req() - Handle incoming Process Logout (PRLO) request |
| 1186 | * @rport: Fibre Channel remote port that initiated PRLO | 1208 | * @rport: Fibre Channel remote port that initiated PRLO |
| 1187 | * @sp: current sequence in the PRLO exchange | 1209 | * @sp: current sequence in the PRLO exchange |
| 1188 | * @fp: PRLO request frame | 1210 | * @fp: PRLO request frame |
| @@ -1213,7 +1235,7 @@ static void fc_rport_recv_prlo_req(struct fc_rport *rport, struct fc_seq *sp, | |||
| 1213 | } | 1235 | } |
| 1214 | 1236 | ||
| 1215 | /** | 1237 | /** |
| 1216 | * fc_rport_recv_logo_req - Handle incoming Logout (LOGO) request | 1238 | * fc_rport_recv_logo_req() - Handle incoming Logout (LOGO) request |
| 1217 | * @rport: Fibre Channel remote port that initiated LOGO | 1239 | * @rport: Fibre Channel remote port that initiated LOGO |
| 1218 | * @sp: current sequence in the LOGO exchange | 1240 | * @sp: current sequence in the LOGO exchange |
| 1219 | * @fp: LOGO request frame | 1241 | * @fp: LOGO request frame |
| @@ -1249,6 +1271,9 @@ static void fc_rport_flush_queue(void) | |||
| 1249 | 1271 | ||
| 1250 | int fc_rport_init(struct fc_lport *lport) | 1272 | int fc_rport_init(struct fc_lport *lport) |
| 1251 | { | 1273 | { |
| 1274 | if (!lport->tt.rport_create) | ||
| 1275 | lport->tt.rport_create = fc_rport_rogue_create; | ||
| 1276 | |||
| 1252 | if (!lport->tt.rport_login) | 1277 | if (!lport->tt.rport_login) |
| 1253 | lport->tt.rport_login = fc_rport_login; | 1278 | lport->tt.rport_login = fc_rport_login; |
| 1254 | 1279 | ||
| @@ -1285,7 +1310,7 @@ void fc_rport_terminate_io(struct fc_rport *rport) | |||
| 1285 | struct fc_rport_libfc_priv *rdata = rport->dd_data; | 1310 | struct fc_rport_libfc_priv *rdata = rport->dd_data; |
| 1286 | struct fc_lport *lport = rdata->local_port; | 1311 | struct fc_lport *lport = rdata->local_port; |
| 1287 | 1312 | ||
| 1288 | lport->tt.exch_mgr_reset(lport->emp, 0, rport->port_id); | 1313 | lport->tt.exch_mgr_reset(lport, 0, rport->port_id); |
| 1289 | lport->tt.exch_mgr_reset(lport->emp, rport->port_id, 0); | 1314 | lport->tt.exch_mgr_reset(lport, rport->port_id, 0); |
| 1290 | } | 1315 | } |
| 1291 | EXPORT_SYMBOL(fc_rport_terminate_io); | 1316 | EXPORT_SYMBOL(fc_rport_terminate_io); |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index f4c57227ec1..ee9d4015243 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -244,12 +244,6 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, | |||
| 244 | if (ha->optrom_state != QLA_SWAITING) | 244 | if (ha->optrom_state != QLA_SWAITING) |
| 245 | break; | 245 | break; |
| 246 | 246 | ||
| 247 | if (start & 0xfff) { | ||
| 248 | qla_printk(KERN_WARNING, ha, | ||
| 249 | "Invalid start region 0x%x/0x%x.\n", start, size); | ||
| 250 | return -EINVAL; | ||
| 251 | } | ||
| 252 | |||
| 253 | ha->optrom_region_start = start; | 247 | ha->optrom_region_start = start; |
| 254 | ha->optrom_region_size = start + size > ha->optrom_size ? | 248 | ha->optrom_region_size = start + size > ha->optrom_size ? |
| 255 | ha->optrom_size - start : size; | 249 | ha->optrom_size - start : size; |
| @@ -303,8 +297,7 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, | |||
| 303 | else if (start == (ha->flt_region_boot * 4) || | 297 | else if (start == (ha->flt_region_boot * 4) || |
| 304 | start == (ha->flt_region_fw * 4)) | 298 | start == (ha->flt_region_fw * 4)) |
| 305 | valid = 1; | 299 | valid = 1; |
| 306 | else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && | 300 | else if (IS_QLA25XX(ha) || IS_QLA81XX(ha)) |
| 307 | start == (ha->flt_region_vpd_nvram * 4)) | ||
| 308 | valid = 1; | 301 | valid = 1; |
| 309 | if (!valid) { | 302 | if (!valid) { |
| 310 | qla_printk(KERN_WARNING, ha, | 303 | qla_printk(KERN_WARNING, ha, |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 986501759ad..87f9abc7146 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
| @@ -1308,8 +1308,12 @@ qla2x00_init_rings(scsi_qla_host_t *vha) | |||
| 1308 | 1308 | ||
| 1309 | DEBUG(printk("scsi(%ld): Issue init firmware.\n", vha->host_no)); | 1309 | DEBUG(printk("scsi(%ld): Issue init firmware.\n", vha->host_no)); |
| 1310 | 1310 | ||
| 1311 | if (ha->flags.npiv_supported) | 1311 | if (ha->flags.npiv_supported) { |
| 1312 | if (ha->operating_mode == LOOP) | ||
| 1313 | ha->max_npiv_vports = MIN_MULTI_ID_FABRIC - 1; | ||
| 1312 | mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports); | 1314 | mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports); |
| 1315 | } | ||
| 1316 | |||
| 1313 | 1317 | ||
| 1314 | mid_init_cb->options = __constant_cpu_to_le16(BIT_1); | 1318 | mid_init_cb->options = __constant_cpu_to_le16(BIT_1); |
| 1315 | 1319 | ||
| @@ -2610,6 +2614,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
| 2610 | port_id_t wrap, nxt_d_id; | 2614 | port_id_t wrap, nxt_d_id; |
| 2611 | struct qla_hw_data *ha = vha->hw; | 2615 | struct qla_hw_data *ha = vha->hw; |
| 2612 | struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev); | 2616 | struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev); |
| 2617 | struct scsi_qla_host *tvp; | ||
| 2613 | 2618 | ||
| 2614 | rval = QLA_SUCCESS; | 2619 | rval = QLA_SUCCESS; |
| 2615 | 2620 | ||
| @@ -2709,7 +2714,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
| 2709 | /* Bypass virtual ports of the same host. */ | 2714 | /* Bypass virtual ports of the same host. */ |
| 2710 | found = 0; | 2715 | found = 0; |
| 2711 | if (ha->num_vhosts) { | 2716 | if (ha->num_vhosts) { |
| 2712 | list_for_each_entry(vp, &ha->vp_list, list) { | 2717 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) { |
| 2713 | if (new_fcport->d_id.b24 == vp->d_id.b24) { | 2718 | if (new_fcport->d_id.b24 == vp->d_id.b24) { |
| 2714 | found = 1; | 2719 | found = 1; |
| 2715 | break; | 2720 | break; |
| @@ -2832,6 +2837,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) | |||
| 2832 | uint16_t first_loop_id; | 2837 | uint16_t first_loop_id; |
| 2833 | struct qla_hw_data *ha = vha->hw; | 2838 | struct qla_hw_data *ha = vha->hw; |
| 2834 | struct scsi_qla_host *vp; | 2839 | struct scsi_qla_host *vp; |
| 2840 | struct scsi_qla_host *tvp; | ||
| 2835 | 2841 | ||
| 2836 | rval = QLA_SUCCESS; | 2842 | rval = QLA_SUCCESS; |
| 2837 | 2843 | ||
| @@ -2856,7 +2862,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev) | |||
| 2856 | /* Check for loop ID being already in use. */ | 2862 | /* Check for loop ID being already in use. */ |
| 2857 | found = 0; | 2863 | found = 0; |
| 2858 | fcport = NULL; | 2864 | fcport = NULL; |
| 2859 | list_for_each_entry(vp, &ha->vp_list, list) { | 2865 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) { |
| 2860 | list_for_each_entry(fcport, &vp->vp_fcports, list) { | 2866 | list_for_each_entry(fcport, &vp->vp_fcports, list) { |
| 2861 | if (fcport->loop_id == dev->loop_id && | 2867 | if (fcport->loop_id == dev->loop_id && |
| 2862 | fcport != dev) { | 2868 | fcport != dev) { |
| @@ -3291,6 +3297,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) | |||
| 3291 | uint8_t status = 0; | 3297 | uint8_t status = 0; |
| 3292 | struct qla_hw_data *ha = vha->hw; | 3298 | struct qla_hw_data *ha = vha->hw; |
| 3293 | struct scsi_qla_host *vp; | 3299 | struct scsi_qla_host *vp; |
| 3300 | struct scsi_qla_host *tvp; | ||
| 3294 | struct req_que *req = ha->req_q_map[0]; | 3301 | struct req_que *req = ha->req_q_map[0]; |
| 3295 | 3302 | ||
| 3296 | if (vha->flags.online) { | 3303 | if (vha->flags.online) { |
| @@ -3306,7 +3313,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) | |||
| 3306 | if (atomic_read(&vha->loop_state) != LOOP_DOWN) { | 3313 | if (atomic_read(&vha->loop_state) != LOOP_DOWN) { |
| 3307 | atomic_set(&vha->loop_state, LOOP_DOWN); | 3314 | atomic_set(&vha->loop_state, LOOP_DOWN); |
| 3308 | qla2x00_mark_all_devices_lost(vha, 0); | 3315 | qla2x00_mark_all_devices_lost(vha, 0); |
| 3309 | list_for_each_entry(vp, &ha->vp_list, list) | 3316 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) |
| 3310 | qla2x00_mark_all_devices_lost(vp, 0); | 3317 | qla2x00_mark_all_devices_lost(vp, 0); |
| 3311 | } else { | 3318 | } else { |
| 3312 | if (!atomic_read(&vha->loop_down_timer)) | 3319 | if (!atomic_read(&vha->loop_down_timer)) |
| @@ -3403,7 +3410,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) | |||
| 3403 | DEBUG(printk(KERN_INFO | 3410 | DEBUG(printk(KERN_INFO |
| 3404 | "qla2x00_abort_isp(%ld): succeeded.\n", | 3411 | "qla2x00_abort_isp(%ld): succeeded.\n", |
| 3405 | vha->host_no)); | 3412 | vha->host_no)); |
| 3406 | list_for_each_entry(vp, &ha->vp_list, list) { | 3413 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) { |
| 3407 | if (vp->vp_idx) | 3414 | if (vp->vp_idx) |
| 3408 | qla2x00_vp_abort_isp(vp); | 3415 | qla2x00_vp_abort_isp(vp); |
| 3409 | } | 3416 | } |
| @@ -3428,7 +3435,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha) | |||
| 3428 | static int | 3435 | static int |
| 3429 | qla2x00_restart_isp(scsi_qla_host_t *vha) | 3436 | qla2x00_restart_isp(scsi_qla_host_t *vha) |
| 3430 | { | 3437 | { |
| 3431 | uint8_t status = 0; | 3438 | int status = 0; |
| 3432 | uint32_t wait_time; | 3439 | uint32_t wait_time; |
| 3433 | struct qla_hw_data *ha = vha->hw; | 3440 | struct qla_hw_data *ha = vha->hw; |
| 3434 | struct req_que *req = ha->req_q_map[0]; | 3441 | struct req_que *req = ha->req_q_map[0]; |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 4c7504cb399..4aab7acf752 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -2685,6 +2685,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, | |||
| 2685 | uint16_t stat = le16_to_cpu(rptid_entry->vp_idx); | 2685 | uint16_t stat = le16_to_cpu(rptid_entry->vp_idx); |
| 2686 | struct qla_hw_data *ha = vha->hw; | 2686 | struct qla_hw_data *ha = vha->hw; |
| 2687 | scsi_qla_host_t *vp; | 2687 | scsi_qla_host_t *vp; |
| 2688 | scsi_qla_host_t *tvp; | ||
| 2688 | 2689 | ||
| 2689 | if (rptid_entry->entry_status != 0) | 2690 | if (rptid_entry->entry_status != 0) |
| 2690 | return; | 2691 | return; |
| @@ -2710,7 +2711,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, | |||
| 2710 | if (MSB(stat) == 1) | 2711 | if (MSB(stat) == 1) |
| 2711 | return; | 2712 | return; |
| 2712 | 2713 | ||
| 2713 | list_for_each_entry(vp, &ha->vp_list, list) | 2714 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) |
| 2714 | if (vp_idx == vp->vp_idx) | 2715 | if (vp_idx == vp->vp_idx) |
| 2715 | break; | 2716 | break; |
| 2716 | if (!vp) | 2717 | if (!vp) |
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 3f23932210c..785c61279e6 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
| @@ -69,9 +69,10 @@ static scsi_qla_host_t * | |||
| 69 | qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name) | 69 | qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name) |
| 70 | { | 70 | { |
| 71 | scsi_qla_host_t *vha; | 71 | scsi_qla_host_t *vha; |
| 72 | struct scsi_qla_host *tvha; | ||
| 72 | 73 | ||
| 73 | /* Locate matching device in database. */ | 74 | /* Locate matching device in database. */ |
| 74 | list_for_each_entry(vha, &ha->vp_list, list) { | 75 | list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) { |
| 75 | if (!memcmp(port_name, vha->port_name, WWN_SIZE)) | 76 | if (!memcmp(port_name, vha->port_name, WWN_SIZE)) |
| 76 | return vha; | 77 | return vha; |
| 77 | } | 78 | } |
| @@ -194,11 +195,11 @@ qla24xx_configure_vp(scsi_qla_host_t *vha) | |||
| 194 | void | 195 | void |
| 195 | qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb) | 196 | qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb) |
| 196 | { | 197 | { |
| 197 | scsi_qla_host_t *vha; | 198 | scsi_qla_host_t *vha, *tvha; |
| 198 | struct qla_hw_data *ha = rsp->hw; | 199 | struct qla_hw_data *ha = rsp->hw; |
| 199 | int i = 0; | 200 | int i = 0; |
| 200 | 201 | ||
| 201 | list_for_each_entry(vha, &ha->vp_list, list) { | 202 | list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) { |
| 202 | if (vha->vp_idx) { | 203 | if (vha->vp_idx) { |
| 203 | switch (mb[0]) { | 204 | switch (mb[0]) { |
| 204 | case MBA_LIP_OCCURRED: | 205 | case MBA_LIP_OCCURRED: |
| @@ -300,6 +301,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha) | |||
| 300 | int ret; | 301 | int ret; |
| 301 | struct qla_hw_data *ha = vha->hw; | 302 | struct qla_hw_data *ha = vha->hw; |
| 302 | scsi_qla_host_t *vp; | 303 | scsi_qla_host_t *vp; |
| 304 | struct scsi_qla_host *tvp; | ||
| 303 | 305 | ||
| 304 | if (vha->vp_idx) | 306 | if (vha->vp_idx) |
| 305 | return; | 307 | return; |
| @@ -308,7 +310,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha) | |||
| 308 | 310 | ||
| 309 | clear_bit(VP_DPC_NEEDED, &vha->dpc_flags); | 311 | clear_bit(VP_DPC_NEEDED, &vha->dpc_flags); |
| 310 | 312 | ||
| 311 | list_for_each_entry(vp, &ha->vp_list, list) { | 313 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) { |
| 312 | if (vp->vp_idx) | 314 | if (vp->vp_idx) |
| 313 | ret = qla2x00_do_dpc_vp(vp); | 315 | ret = qla2x00_do_dpc_vp(vp); |
| 314 | } | 316 | } |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 2f5f72531e2..3ddfa889e94 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -2222,10 +2222,6 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, | |||
| 2222 | { | 2222 | { |
| 2223 | char name[16]; | 2223 | char name[16]; |
| 2224 | 2224 | ||
| 2225 | ha->init_cb_size = sizeof(init_cb_t); | ||
| 2226 | if (IS_QLA2XXX_MIDTYPE(ha)) | ||
| 2227 | ha->init_cb_size = sizeof(struct mid_init_cb_24xx); | ||
| 2228 | |||
| 2229 | ha->init_cb = dma_alloc_coherent(&ha->pdev->dev, ha->init_cb_size, | 2225 | ha->init_cb = dma_alloc_coherent(&ha->pdev->dev, ha->init_cb_size, |
| 2230 | &ha->init_cb_dma, GFP_KERNEL); | 2226 | &ha->init_cb_dma, GFP_KERNEL); |
| 2231 | if (!ha->init_cb) | 2227 | if (!ha->init_cb) |
| @@ -2568,7 +2564,7 @@ qla2x00_do_work(struct scsi_qla_host *vha) | |||
| 2568 | void qla2x00_relogin(struct scsi_qla_host *vha) | 2564 | void qla2x00_relogin(struct scsi_qla_host *vha) |
| 2569 | { | 2565 | { |
| 2570 | fc_port_t *fcport; | 2566 | fc_port_t *fcport; |
| 2571 | uint8_t status; | 2567 | int status; |
| 2572 | uint16_t next_loopid = 0; | 2568 | uint16_t next_loopid = 0; |
| 2573 | struct qla_hw_data *ha = vha->hw; | 2569 | struct qla_hw_data *ha = vha->hw; |
| 2574 | 2570 | ||
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 79f7053da99..a772eab2f0e 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.03.00-k3" | 10 | #define QLA2XXX_VERSION "8.03.00-k4" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 3 | 13 | #define QLA_DRIVER_MINOR_VER 3 |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 55310dbc10a..4970ae4a62d 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -1167,23 +1167,19 @@ sd_spinup_disk(struct scsi_disk *sdkp) | |||
| 1167 | /* | 1167 | /* |
| 1168 | * The device does not want the automatic start to be issued. | 1168 | * The device does not want the automatic start to be issued. |
| 1169 | */ | 1169 | */ |
| 1170 | if (sdkp->device->no_start_on_add) { | 1170 | if (sdkp->device->no_start_on_add) |
| 1171 | break; | 1171 | break; |
| 1172 | } | ||
| 1173 | |||
| 1174 | /* | ||
| 1175 | * If manual intervention is required, or this is an | ||
| 1176 | * absent USB storage device, a spinup is meaningless. | ||
| 1177 | */ | ||
| 1178 | if (sense_valid && | ||
| 1179 | sshdr.sense_key == NOT_READY && | ||
| 1180 | sshdr.asc == 4 && sshdr.ascq == 3) { | ||
| 1181 | break; /* manual intervention required */ | ||
| 1182 | 1172 | ||
| 1183 | /* | 1173 | if (sense_valid && sshdr.sense_key == NOT_READY) { |
| 1184 | * Issue command to spin up drive when not ready | 1174 | if (sshdr.asc == 4 && sshdr.ascq == 3) |
| 1185 | */ | 1175 | break; /* manual intervention required */ |
| 1186 | } else if (sense_valid && sshdr.sense_key == NOT_READY) { | 1176 | if (sshdr.asc == 4 && sshdr.ascq == 0xb) |
| 1177 | break; /* standby */ | ||
| 1178 | if (sshdr.asc == 4 && sshdr.ascq == 0xc) | ||
| 1179 | break; /* unavailable */ | ||
| 1180 | /* | ||
| 1181 | * Issue command to spin up drive when not ready | ||
| 1182 | */ | ||
| 1187 | if (!spintime) { | 1183 | if (!spintime) { |
| 1188 | sd_printk(KERN_NOTICE, sdkp, "Spinning up disk..."); | 1184 | sd_printk(KERN_NOTICE, sdkp, "Spinning up disk..."); |
| 1189 | cmd[0] = START_STOP; | 1185 | cmd[0] = START_STOP; |
diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h index 57aaa8f0d61..f271d9cc0fc 100644 --- a/include/scsi/fc/fc_fcoe.h +++ b/include/scsi/fc/fc_fcoe.h | |||
| @@ -31,10 +31,6 @@ | |||
| 31 | #define ETH_P_FCOE 0x8906 /* FCOE ether type */ | 31 | #define ETH_P_FCOE 0x8906 /* FCOE ether type */ |
| 32 | #endif | 32 | #endif |
| 33 | 33 | ||
| 34 | #ifndef ETH_P_8021Q | ||
| 35 | #define ETH_P_8021Q 0x8100 | ||
| 36 | #endif | ||
| 37 | |||
| 38 | /* | 34 | /* |
| 39 | * FC_FCOE_OUI hasn't been standardized yet. XXX TBD. | 35 | * FC_FCOE_OUI hasn't been standardized yet. XXX TBD. |
| 40 | */ | 36 | */ |
diff --git a/include/scsi/fc/fc_fs.h b/include/scsi/fc/fc_fs.h index 3e4801d2bdb..1b7af3a64c7 100644 --- a/include/scsi/fc/fc_fs.h +++ b/include/scsi/fc/fc_fs.h | |||
| @@ -337,4 +337,9 @@ enum fc_pf_rjt_reason { | |||
| 337 | FC_RJT_VENDOR = 0xff, /* vendor specific reject */ | 337 | FC_RJT_VENDOR = 0xff, /* vendor specific reject */ |
| 338 | }; | 338 | }; |
| 339 | 339 | ||
| 340 | /* default timeout values */ | ||
| 341 | |||
| 342 | #define FC_DEF_E_D_TOV 2000UL | ||
| 343 | #define FC_DEF_R_A_TOV 10000UL | ||
| 344 | |||
| 340 | #endif /* _FC_FS_H_ */ | 345 | #endif /* _FC_FS_H_ */ |
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 9f2876397dd..a2e126b86e3 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
| @@ -68,9 +68,6 @@ | |||
| 68 | /* | 68 | /* |
| 69 | * FC HBA status | 69 | * FC HBA status |
| 70 | */ | 70 | */ |
| 71 | #define FC_PAUSE (1 << 1) | ||
| 72 | #define FC_LINK_UP (1 << 0) | ||
| 73 | |||
| 74 | enum fc_lport_state { | 71 | enum fc_lport_state { |
| 75 | LPORT_ST_NONE = 0, | 72 | LPORT_ST_NONE = 0, |
| 76 | LPORT_ST_FLOGI, | 73 | LPORT_ST_FLOGI, |
| @@ -339,31 +336,17 @@ struct fc_exch { | |||
| 339 | 336 | ||
| 340 | struct libfc_function_template { | 337 | struct libfc_function_template { |
| 341 | 338 | ||
| 342 | /** | ||
| 343 | * Mandatory Fields | ||
| 344 | * | ||
| 345 | * These handlers must be implemented by the LLD. | ||
| 346 | */ | ||
| 347 | |||
| 348 | /* | 339 | /* |
| 349 | * Interface to send a FC frame | 340 | * Interface to send a FC frame |
| 350 | */ | ||
| 351 | int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp); | ||
| 352 | |||
| 353 | /** | ||
| 354 | * Optional Fields | ||
| 355 | * | 341 | * |
| 356 | * The LLD may choose to implement any of the following handlers. | 342 | * STATUS: REQUIRED |
| 357 | * If LLD doesn't specify hander and leaves its pointer NULL then | ||
| 358 | * the default libfc function will be used for that handler. | ||
| 359 | */ | ||
| 360 | |||
| 361 | /** | ||
| 362 | * ELS/CT interfaces | ||
| 363 | */ | 343 | */ |
| 344 | int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp); | ||
| 364 | 345 | ||
| 365 | /* | 346 | /* |
| 366 | * elsct_send - sends ELS/CT frame | 347 | * Interface to send ELS/CT frames |
| 348 | * | ||
| 349 | * STATUS: OPTIONAL | ||
| 367 | */ | 350 | */ |
| 368 | struct fc_seq *(*elsct_send)(struct fc_lport *lport, | 351 | struct fc_seq *(*elsct_send)(struct fc_lport *lport, |
| 369 | struct fc_rport *rport, | 352 | struct fc_rport *rport, |
| @@ -373,9 +356,6 @@ struct libfc_function_template { | |||
| 373 | struct fc_frame *fp, | 356 | struct fc_frame *fp, |
| 374 | void *arg), | 357 | void *arg), |
| 375 | void *arg, u32 timer_msec); | 358 | void *arg, u32 timer_msec); |
| 376 | /** | ||
| 377 | * Exhance Manager interfaces | ||
| 378 | */ | ||
| 379 | 359 | ||
| 380 | /* | 360 | /* |
| 381 | * Send the FC frame payload using a new exchange and sequence. | 361 | * Send the FC frame payload using a new exchange and sequence. |
| @@ -407,6 +387,8 @@ struct libfc_function_template { | |||
| 407 | * timer_msec argument is specified. The timer is canceled when | 387 | * timer_msec argument is specified. The timer is canceled when |
| 408 | * it fires or when the exchange is done. The exchange timeout handler | 388 | * it fires or when the exchange is done. The exchange timeout handler |
| 409 | * is registered by EM layer. | 389 | * is registered by EM layer. |
| 390 | * | ||
| 391 | * STATUS: OPTIONAL | ||
| 410 | */ | 392 | */ |
| 411 | struct fc_seq *(*exch_seq_send)(struct fc_lport *lp, | 393 | struct fc_seq *(*exch_seq_send)(struct fc_lport *lp, |
| 412 | struct fc_frame *fp, | 394 | struct fc_frame *fp, |
| @@ -418,14 +400,18 @@ struct libfc_function_template { | |||
| 418 | void *arg, unsigned int timer_msec); | 400 | void *arg, unsigned int timer_msec); |
| 419 | 401 | ||
| 420 | /* | 402 | /* |
| 421 | * send a frame using existing sequence and exchange. | 403 | * Send a frame using an existing sequence and exchange. |
| 404 | * | ||
| 405 | * STATUS: OPTIONAL | ||
| 422 | */ | 406 | */ |
| 423 | int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp, | 407 | int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp, |
| 424 | struct fc_frame *fp); | 408 | struct fc_frame *fp); |
| 425 | 409 | ||
| 426 | /* | 410 | /* |
| 427 | * Send ELS response using mainly infomation | 411 | * Send an ELS response using infomation from a previous |
| 428 | * in exchange and sequence in EM layer. | 412 | * exchange and sequence. |
| 413 | * | ||
| 414 | * STATUS: OPTIONAL | ||
| 429 | */ | 415 | */ |
| 430 | void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd, | 416 | void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd, |
| 431 | struct fc_seq_els_data *els_data); | 417 | struct fc_seq_els_data *els_data); |
| @@ -437,6 +423,8 @@ struct libfc_function_template { | |||
| 437 | * A timer_msec can be specified for abort timeout, if non-zero | 423 | * A timer_msec can be specified for abort timeout, if non-zero |
| 438 | * timer_msec value is specified then exchange resp handler | 424 | * timer_msec value is specified then exchange resp handler |
| 439 | * will be called with timeout error if no response to abort. | 425 | * will be called with timeout error if no response to abort. |
| 426 | * | ||
| 427 | * STATUS: OPTIONAL | ||
| 440 | */ | 428 | */ |
| 441 | int (*seq_exch_abort)(const struct fc_seq *req_sp, | 429 | int (*seq_exch_abort)(const struct fc_seq *req_sp, |
| 442 | unsigned int timer_msec); | 430 | unsigned int timer_msec); |
| @@ -444,6 +432,8 @@ struct libfc_function_template { | |||
| 444 | /* | 432 | /* |
| 445 | * Indicate that an exchange/sequence tuple is complete and the memory | 433 | * Indicate that an exchange/sequence tuple is complete and the memory |
| 446 | * allocated for the related objects may be freed. | 434 | * allocated for the related objects may be freed. |
| 435 | * | ||
| 436 | * STATUS: OPTIONAL | ||
| 447 | */ | 437 | */ |
| 448 | void (*exch_done)(struct fc_seq *sp); | 438 | void (*exch_done)(struct fc_seq *sp); |
| 449 | 439 | ||
| @@ -451,6 +441,8 @@ struct libfc_function_template { | |||
| 451 | * Assigns a EM and a free XID for an new exchange and then | 441 | * Assigns a EM and a free XID for an new exchange and then |
| 452 | * allocates a new exchange and sequence pair. | 442 | * allocates a new exchange and sequence pair. |
| 453 | * The fp can be used to determine free XID. | 443 | * The fp can be used to determine free XID. |
| 444 | * | ||
| 445 | * STATUS: OPTIONAL | ||
| 454 | */ | 446 | */ |
| 455 | struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp); | 447 | struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp); |
| 456 | 448 | ||
| @@ -458,12 +450,16 @@ struct libfc_function_template { | |||
| 458 | * Release previously assigned XID by exch_get API. | 450 | * Release previously assigned XID by exch_get API. |
| 459 | * The LLD may implement this if XID is assigned by LLD | 451 | * The LLD may implement this if XID is assigned by LLD |
| 460 | * in exch_get(). | 452 | * in exch_get(). |
| 453 | * | ||
| 454 | * STATUS: OPTIONAL | ||
| 461 | */ | 455 | */ |
| 462 | void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp, | 456 | void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp, |
| 463 | u16 ex_id); | 457 | u16 ex_id); |
| 464 | 458 | ||
| 465 | /* | 459 | /* |
| 466 | * Start a new sequence on the same exchange/sequence tuple. | 460 | * Start a new sequence on the same exchange/sequence tuple. |
| 461 | * | ||
| 462 | * STATUS: OPTIONAL | ||
| 467 | */ | 463 | */ |
| 468 | struct fc_seq *(*seq_start_next)(struct fc_seq *sp); | 464 | struct fc_seq *(*seq_start_next)(struct fc_seq *sp); |
| 469 | 465 | ||
| @@ -471,26 +467,38 @@ struct libfc_function_template { | |||
| 471 | * Reset an exchange manager, completing all sequences and exchanges. | 467 | * Reset an exchange manager, completing all sequences and exchanges. |
| 472 | * If s_id is non-zero, reset only exchanges originating from that FID. | 468 | * If s_id is non-zero, reset only exchanges originating from that FID. |
| 473 | * If d_id is non-zero, reset only exchanges sending to that FID. | 469 | * If d_id is non-zero, reset only exchanges sending to that FID. |
| 470 | * | ||
| 471 | * STATUS: OPTIONAL | ||
| 474 | */ | 472 | */ |
| 475 | void (*exch_mgr_reset)(struct fc_exch_mgr *, | 473 | void (*exch_mgr_reset)(struct fc_lport *, |
| 476 | u32 s_id, u32 d_id); | 474 | u32 s_id, u32 d_id); |
| 477 | 475 | ||
| 478 | void (*rport_flush_queue)(void); | 476 | /* |
| 479 | /** | 477 | * Flush the rport work queue. Generally used before shutdown. |
| 480 | * Local Port interfaces | 478 | * |
| 479 | * STATUS: OPTIONAL | ||
| 481 | */ | 480 | */ |
| 481 | void (*rport_flush_queue)(void); | ||
| 482 | 482 | ||
| 483 | /* | 483 | /* |
| 484 | * Receive a frame to a local port. | 484 | * Receive a frame for a local port. |
| 485 | * | ||
| 486 | * STATUS: OPTIONAL | ||
| 485 | */ | 487 | */ |
| 486 | void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp, | 488 | void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp, |
| 487 | struct fc_frame *fp); | 489 | struct fc_frame *fp); |
| 488 | 490 | ||
| 491 | /* | ||
| 492 | * Reset the local port. | ||
| 493 | * | ||
| 494 | * STATUS: OPTIONAL | ||
| 495 | */ | ||
| 489 | int (*lport_reset)(struct fc_lport *); | 496 | int (*lport_reset)(struct fc_lport *); |
| 490 | 497 | ||
| 491 | /** | 498 | /* |
| 492 | * Remote Port interfaces | 499 | * Create a remote port |
| 493 | */ | 500 | */ |
| 501 | struct fc_rport *(*rport_create)(struct fc_disc_port *); | ||
| 494 | 502 | ||
| 495 | /* | 503 | /* |
| 496 | * Initiates the RP state machine. It is called from the LP module. | 504 | * Initiates the RP state machine. It is called from the LP module. |
| @@ -500,26 +508,33 @@ struct libfc_function_template { | |||
| 500 | * - PLOGI | 508 | * - PLOGI |
| 501 | * - PRLI | 509 | * - PRLI |
| 502 | * - RTV | 510 | * - RTV |
| 511 | * | ||
| 512 | * STATUS: OPTIONAL | ||
| 503 | */ | 513 | */ |
| 504 | int (*rport_login)(struct fc_rport *rport); | 514 | int (*rport_login)(struct fc_rport *rport); |
| 505 | 515 | ||
| 506 | /* | 516 | /* |
| 507 | * Logoff, and remove the rport from the transport if | 517 | * Logoff, and remove the rport from the transport if |
| 508 | * it had been added. This will send a LOGO to the target. | 518 | * it had been added. This will send a LOGO to the target. |
| 519 | * | ||
| 520 | * STATUS: OPTIONAL | ||
| 509 | */ | 521 | */ |
| 510 | int (*rport_logoff)(struct fc_rport *rport); | 522 | int (*rport_logoff)(struct fc_rport *rport); |
| 511 | 523 | ||
| 512 | /* | 524 | /* |
| 513 | * Recieve a request from a remote port. | 525 | * Recieve a request from a remote port. |
| 526 | * | ||
| 527 | * STATUS: OPTIONAL | ||
| 514 | */ | 528 | */ |
| 515 | void (*rport_recv_req)(struct fc_seq *, struct fc_frame *, | 529 | void (*rport_recv_req)(struct fc_seq *, struct fc_frame *, |
| 516 | struct fc_rport *); | 530 | struct fc_rport *); |
| 517 | 531 | ||
| 518 | struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32); | 532 | /* |
| 519 | 533 | * lookup an rport by it's port ID. | |
| 520 | /** | 534 | * |
| 521 | * FCP interfaces | 535 | * STATUS: OPTIONAL |
| 522 | */ | 536 | */ |
| 537 | struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32); | ||
| 523 | 538 | ||
| 524 | /* | 539 | /* |
| 525 | * Send a fcp cmd from fsp pkt. | 540 | * Send a fcp cmd from fsp pkt. |
| @@ -527,30 +542,38 @@ struct libfc_function_template { | |||
| 527 | * | 542 | * |
| 528 | * The resp handler is called when FCP_RSP received. | 543 | * The resp handler is called when FCP_RSP received. |
| 529 | * | 544 | * |
| 545 | * STATUS: OPTIONAL | ||
| 530 | */ | 546 | */ |
| 531 | int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp, | 547 | int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp, |
| 532 | void (*resp)(struct fc_seq *, struct fc_frame *fp, | 548 | void (*resp)(struct fc_seq *, struct fc_frame *fp, |
| 533 | void *arg)); | 549 | void *arg)); |
| 534 | 550 | ||
| 535 | /* | 551 | /* |
| 536 | * Used at least durring linkdown and reset | 552 | * Cleanup the FCP layer, used durring link down and reset |
| 553 | * | ||
| 554 | * STATUS: OPTIONAL | ||
| 537 | */ | 555 | */ |
| 538 | void (*fcp_cleanup)(struct fc_lport *lp); | 556 | void (*fcp_cleanup)(struct fc_lport *lp); |
| 539 | 557 | ||
| 540 | /* | 558 | /* |
| 541 | * Abort all I/O on a local port | 559 | * Abort all I/O on a local port |
| 560 | * | ||
| 561 | * STATUS: OPTIONAL | ||
| 542 | */ | 562 | */ |
| 543 | void (*fcp_abort_io)(struct fc_lport *lp); | 563 | void (*fcp_abort_io)(struct fc_lport *lp); |
| 544 | 564 | ||
| 545 | /** | 565 | /* |
| 546 | * Discovery interfaces | 566 | * Receive a request for the discovery layer. |
| 567 | * | ||
| 568 | * STATUS: OPTIONAL | ||
| 547 | */ | 569 | */ |
| 548 | |||
| 549 | void (*disc_recv_req)(struct fc_seq *, | 570 | void (*disc_recv_req)(struct fc_seq *, |
| 550 | struct fc_frame *, struct fc_lport *); | 571 | struct fc_frame *, struct fc_lport *); |
| 551 | 572 | ||
| 552 | /* | 573 | /* |
| 553 | * Start discovery for a local port. | 574 | * Start discovery for a local port. |
| 575 | * | ||
| 576 | * STATUS: OPTIONAL | ||
| 554 | */ | 577 | */ |
| 555 | void (*disc_start)(void (*disc_callback)(struct fc_lport *, | 578 | void (*disc_start)(void (*disc_callback)(struct fc_lport *, |
| 556 | enum fc_disc_event), | 579 | enum fc_disc_event), |
| @@ -559,6 +582,8 @@ struct libfc_function_template { | |||
| 559 | /* | 582 | /* |
| 560 | * Stop discovery for a given lport. This will remove | 583 | * Stop discovery for a given lport. This will remove |
| 561 | * all discovered rports | 584 | * all discovered rports |
| 585 | * | ||
| 586 | * STATUS: OPTIONAL | ||
| 562 | */ | 587 | */ |
| 563 | void (*disc_stop) (struct fc_lport *); | 588 | void (*disc_stop) (struct fc_lport *); |
| 564 | 589 | ||
| @@ -566,6 +591,8 @@ struct libfc_function_template { | |||
| 566 | * Stop discovery for a given lport. This will block | 591 | * Stop discovery for a given lport. This will block |
| 567 | * until all discovered rports are deleted from the | 592 | * until all discovered rports are deleted from the |
| 568 | * FC transport class | 593 | * FC transport class |
| 594 | * | ||
| 595 | * STATUS: OPTIONAL | ||
| 569 | */ | 596 | */ |
| 570 | void (*disc_stop_final) (struct fc_lport *); | 597 | void (*disc_stop_final) (struct fc_lport *); |
| 571 | }; | 598 | }; |
| @@ -603,7 +630,8 @@ struct fc_lport { | |||
| 603 | 630 | ||
| 604 | /* Operational Information */ | 631 | /* Operational Information */ |
| 605 | struct libfc_function_template tt; | 632 | struct libfc_function_template tt; |
| 606 | u16 link_status; | 633 | u8 link_up; |
| 634 | u8 qfull; | ||
| 607 | enum fc_lport_state state; | 635 | enum fc_lport_state state; |
| 608 | unsigned long boot_time; | 636 | unsigned long boot_time; |
| 609 | 637 | ||
| @@ -637,7 +665,7 @@ struct fc_lport { | |||
| 637 | struct delayed_work disc_work; | 665 | struct delayed_work disc_work; |
| 638 | }; | 666 | }; |
| 639 | 667 | ||
| 640 | /** | 668 | /* |
| 641 | * FC_LPORT HELPER FUNCTIONS | 669 | * FC_LPORT HELPER FUNCTIONS |
| 642 | *****************************/ | 670 | *****************************/ |
| 643 | static inline void *lport_priv(const struct fc_lport *lp) | 671 | static inline void *lport_priv(const struct fc_lport *lp) |
| @@ -669,7 +697,7 @@ static inline void fc_lport_state_enter(struct fc_lport *lp, | |||
| 669 | } | 697 | } |
| 670 | 698 | ||
| 671 | 699 | ||
| 672 | /** | 700 | /* |
| 673 | * LOCAL PORT LAYER | 701 | * LOCAL PORT LAYER |
| 674 | *****************************/ | 702 | *****************************/ |
| 675 | int fc_lport_init(struct fc_lport *lp); | 703 | int fc_lport_init(struct fc_lport *lp); |
| @@ -704,12 +732,6 @@ void fc_linkup(struct fc_lport *); | |||
| 704 | void fc_linkdown(struct fc_lport *); | 732 | void fc_linkdown(struct fc_lport *); |
| 705 | 733 | ||
| 706 | /* | 734 | /* |
| 707 | * Pause and unpause traffic. | ||
| 708 | */ | ||
| 709 | void fc_pause(struct fc_lport *); | ||
| 710 | void fc_unpause(struct fc_lport *); | ||
| 711 | |||
| 712 | /* | ||
| 713 | * Configure the local port. | 735 | * Configure the local port. |
| 714 | */ | 736 | */ |
| 715 | int fc_lport_config(struct fc_lport *); | 737 | int fc_lport_config(struct fc_lport *); |
| @@ -725,19 +747,19 @@ int fc_lport_reset(struct fc_lport *); | |||
| 725 | int fc_set_mfs(struct fc_lport *lp, u32 mfs); | 747 | int fc_set_mfs(struct fc_lport *lp, u32 mfs); |
| 726 | 748 | ||
| 727 | 749 | ||
| 728 | /** | 750 | /* |
| 729 | * REMOTE PORT LAYER | 751 | * REMOTE PORT LAYER |
| 730 | *****************************/ | 752 | *****************************/ |
| 731 | int fc_rport_init(struct fc_lport *lp); | 753 | int fc_rport_init(struct fc_lport *lp); |
| 732 | void fc_rport_terminate_io(struct fc_rport *rp); | 754 | void fc_rport_terminate_io(struct fc_rport *rp); |
| 733 | 755 | ||
| 734 | /** | 756 | /* |
| 735 | * DISCOVERY LAYER | 757 | * DISCOVERY LAYER |
| 736 | *****************************/ | 758 | *****************************/ |
| 737 | int fc_disc_init(struct fc_lport *lp); | 759 | int fc_disc_init(struct fc_lport *lp); |
| 738 | 760 | ||
| 739 | 761 | ||
| 740 | /** | 762 | /* |
| 741 | * SCSI LAYER | 763 | * SCSI LAYER |
| 742 | *****************************/ | 764 | *****************************/ |
| 743 | /* | 765 | /* |
| @@ -798,7 +820,7 @@ int fc_change_queue_type(struct scsi_device *sdev, int tag_type); | |||
| 798 | */ | 820 | */ |
| 799 | void fc_fcp_destroy(struct fc_lport *); | 821 | void fc_fcp_destroy(struct fc_lport *); |
| 800 | 822 | ||
| 801 | /** | 823 | /* |
| 802 | * ELS/CT interface | 824 | * ELS/CT interface |
| 803 | *****************************/ | 825 | *****************************/ |
| 804 | /* | 826 | /* |
| @@ -807,7 +829,7 @@ void fc_fcp_destroy(struct fc_lport *); | |||
| 807 | int fc_elsct_init(struct fc_lport *lp); | 829 | int fc_elsct_init(struct fc_lport *lp); |
| 808 | 830 | ||
| 809 | 831 | ||
| 810 | /** | 832 | /* |
| 811 | * EXCHANGE MANAGER LAYER | 833 | * EXCHANGE MANAGER LAYER |
| 812 | *****************************/ | 834 | *****************************/ |
| 813 | /* | 835 | /* |
| @@ -916,7 +938,7 @@ struct fc_seq *fc_seq_start_next(struct fc_seq *sp); | |||
| 916 | * If s_id is non-zero, reset only exchanges originating from that FID. | 938 | * If s_id is non-zero, reset only exchanges originating from that FID. |
| 917 | * If d_id is non-zero, reset only exchanges sending to that FID. | 939 | * If d_id is non-zero, reset only exchanges sending to that FID. |
| 918 | */ | 940 | */ |
| 919 | void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id); | 941 | void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id); |
| 920 | 942 | ||
| 921 | /* | 943 | /* |
| 922 | * Functions for fc_functions_template | 944 | * Functions for fc_functions_template |
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index 89fdbb9a6a1..941818f29f5 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h | |||
| @@ -46,6 +46,7 @@ struct fcoe_softc { | |||
| 46 | struct net_device *phys_dev; /* device with ethtool_ops */ | 46 | struct net_device *phys_dev; /* device with ethtool_ops */ |
| 47 | struct packet_type fcoe_packet_type; | 47 | struct packet_type fcoe_packet_type; |
| 48 | struct sk_buff_head fcoe_pending_queue; | 48 | struct sk_buff_head fcoe_pending_queue; |
| 49 | u8 fcoe_pending_queue_active; | ||
| 49 | 50 | ||
| 50 | u8 dest_addr[ETH_ALEN]; | 51 | u8 dest_addr[ETH_ALEN]; |
| 51 | u8 ctl_src_addr[ETH_ALEN]; | 52 | u8 ctl_src_addr[ETH_ALEN]; |
| @@ -58,16 +59,10 @@ struct fcoe_softc { | |||
| 58 | u8 address_mode; | 59 | u8 address_mode; |
| 59 | }; | 60 | }; |
| 60 | 61 | ||
| 61 | static inline struct fcoe_softc *fcoe_softc( | ||
| 62 | const struct fc_lport *lp) | ||
| 63 | { | ||
| 64 | return (struct fcoe_softc *)lport_priv(lp); | ||
| 65 | } | ||
| 66 | |||
| 67 | static inline struct net_device *fcoe_netdev( | 62 | static inline struct net_device *fcoe_netdev( |
| 68 | const struct fc_lport *lp) | 63 | const struct fc_lport *lp) |
| 69 | { | 64 | { |
| 70 | return fcoe_softc(lp)->real_dev; | 65 | return ((struct fcoe_softc *)lport_priv(lp))->real_dev; |
| 71 | } | 66 | } |
| 72 | 67 | ||
| 73 | static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) | 68 | static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) |
