diff options
Diffstat (limited to 'drivers')
40 files changed, 399 insertions, 227 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index 7083bcc1b9c7..5045156c5313 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c | |||
| @@ -57,6 +57,8 @@ static LIST_HEAD(descriptor_list); | |||
| 57 | static int descriptor_count; | 57 | static int descriptor_count; |
| 58 | 58 | ||
| 59 | static __be32 tmp_config_rom[256]; | 59 | static __be32 tmp_config_rom[256]; |
| 60 | /* ROM header, bus info block, root dir header, capabilities = 7 quadlets */ | ||
| 61 | static size_t config_rom_length = 1 + 4 + 1 + 1; | ||
| 60 | 62 | ||
| 61 | #define BIB_CRC(v) ((v) << 0) | 63 | #define BIB_CRC(v) ((v) << 0) |
| 62 | #define BIB_CRC_LENGTH(v) ((v) << 16) | 64 | #define BIB_CRC_LENGTH(v) ((v) << 16) |
| @@ -73,7 +75,7 @@ static __be32 tmp_config_rom[256]; | |||
| 73 | #define BIB_CMC ((1) << 30) | 75 | #define BIB_CMC ((1) << 30) |
| 74 | #define BIB_IMC ((1) << 31) | 76 | #define BIB_IMC ((1) << 31) |
| 75 | 77 | ||
| 76 | static size_t generate_config_rom(struct fw_card *card, __be32 *config_rom) | 78 | static void generate_config_rom(struct fw_card *card, __be32 *config_rom) |
| 77 | { | 79 | { |
| 78 | struct fw_descriptor *desc; | 80 | struct fw_descriptor *desc; |
| 79 | int i, j, k, length; | 81 | int i, j, k, length; |
| @@ -130,23 +132,30 @@ static size_t generate_config_rom(struct fw_card *card, __be32 *config_rom) | |||
| 130 | for (i = 0; i < j; i += length + 1) | 132 | for (i = 0; i < j; i += length + 1) |
| 131 | length = fw_compute_block_crc(config_rom + i); | 133 | length = fw_compute_block_crc(config_rom + i); |
| 132 | 134 | ||
| 133 | return j; | 135 | WARN_ON(j != config_rom_length); |
| 134 | } | 136 | } |
| 135 | 137 | ||
| 136 | static void update_config_roms(void) | 138 | static void update_config_roms(void) |
| 137 | { | 139 | { |
| 138 | struct fw_card *card; | 140 | struct fw_card *card; |
| 139 | size_t length; | ||
| 140 | 141 | ||
| 141 | list_for_each_entry (card, &card_list, link) { | 142 | list_for_each_entry (card, &card_list, link) { |
| 142 | length = generate_config_rom(card, tmp_config_rom); | 143 | generate_config_rom(card, tmp_config_rom); |
| 143 | card->driver->set_config_rom(card, tmp_config_rom, length); | 144 | card->driver->set_config_rom(card, tmp_config_rom, |
| 145 | config_rom_length); | ||
| 144 | } | 146 | } |
| 145 | } | 147 | } |
| 146 | 148 | ||
| 149 | static size_t required_space(struct fw_descriptor *desc) | ||
| 150 | { | ||
| 151 | /* descriptor + entry into root dir + optional immediate entry */ | ||
| 152 | return desc->length + 1 + (desc->immediate > 0 ? 1 : 0); | ||
| 153 | } | ||
| 154 | |||
| 147 | int fw_core_add_descriptor(struct fw_descriptor *desc) | 155 | int fw_core_add_descriptor(struct fw_descriptor *desc) |
| 148 | { | 156 | { |
| 149 | size_t i; | 157 | size_t i; |
| 158 | int ret; | ||
| 150 | 159 | ||
| 151 | /* | 160 | /* |
| 152 | * Check descriptor is valid; the length of all blocks in the | 161 | * Check descriptor is valid; the length of all blocks in the |
| @@ -162,15 +171,21 @@ int fw_core_add_descriptor(struct fw_descriptor *desc) | |||
| 162 | 171 | ||
| 163 | mutex_lock(&card_mutex); | 172 | mutex_lock(&card_mutex); |
| 164 | 173 | ||
| 165 | list_add_tail(&desc->link, &descriptor_list); | 174 | if (config_rom_length + required_space(desc) > 256) { |
| 166 | descriptor_count++; | 175 | ret = -EBUSY; |
| 167 | if (desc->immediate > 0) | 176 | } else { |
| 177 | list_add_tail(&desc->link, &descriptor_list); | ||
| 178 | config_rom_length += required_space(desc); | ||
| 168 | descriptor_count++; | 179 | descriptor_count++; |
| 169 | update_config_roms(); | 180 | if (desc->immediate > 0) |
| 181 | descriptor_count++; | ||
| 182 | update_config_roms(); | ||
| 183 | ret = 0; | ||
| 184 | } | ||
| 170 | 185 | ||
| 171 | mutex_unlock(&card_mutex); | 186 | mutex_unlock(&card_mutex); |
| 172 | 187 | ||
| 173 | return 0; | 188 | return ret; |
| 174 | } | 189 | } |
| 175 | EXPORT_SYMBOL(fw_core_add_descriptor); | 190 | EXPORT_SYMBOL(fw_core_add_descriptor); |
| 176 | 191 | ||
| @@ -179,6 +194,7 @@ void fw_core_remove_descriptor(struct fw_descriptor *desc) | |||
| 179 | mutex_lock(&card_mutex); | 194 | mutex_lock(&card_mutex); |
| 180 | 195 | ||
| 181 | list_del(&desc->link); | 196 | list_del(&desc->link); |
| 197 | config_rom_length -= required_space(desc); | ||
| 182 | descriptor_count--; | 198 | descriptor_count--; |
| 183 | if (desc->immediate > 0) | 199 | if (desc->immediate > 0) |
| 184 | descriptor_count--; | 200 | descriptor_count--; |
| @@ -428,7 +444,6 @@ EXPORT_SYMBOL(fw_card_initialize); | |||
| 428 | int fw_card_add(struct fw_card *card, | 444 | int fw_card_add(struct fw_card *card, |
| 429 | u32 max_receive, u32 link_speed, u64 guid) | 445 | u32 max_receive, u32 link_speed, u64 guid) |
| 430 | { | 446 | { |
| 431 | size_t length; | ||
| 432 | int ret; | 447 | int ret; |
| 433 | 448 | ||
| 434 | card->max_receive = max_receive; | 449 | card->max_receive = max_receive; |
| @@ -437,8 +452,8 @@ int fw_card_add(struct fw_card *card, | |||
| 437 | 452 | ||
| 438 | mutex_lock(&card_mutex); | 453 | mutex_lock(&card_mutex); |
| 439 | 454 | ||
| 440 | length = generate_config_rom(card, tmp_config_rom); | 455 | generate_config_rom(card, tmp_config_rom); |
| 441 | ret = card->driver->enable(card, tmp_config_rom, length); | 456 | ret = card->driver->enable(card, tmp_config_rom, config_rom_length); |
| 442 | if (ret == 0) | 457 | if (ret == 0) |
| 443 | list_add_tail(&card->link, &card_list); | 458 | list_add_tail(&card->link, &card_list); |
| 444 | 459 | ||
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index e6d63849e78e..4eeaed57e219 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/preempt.h> | 35 | #include <linux/preempt.h> |
| 36 | #include <linux/sched.h> | 36 | #include <linux/sched.h> |
| 37 | #include <linux/spinlock.h> | 37 | #include <linux/spinlock.h> |
| 38 | #include <linux/string.h> | ||
| 38 | #include <linux/time.h> | 39 | #include <linux/time.h> |
| 39 | #include <linux/uaccess.h> | 40 | #include <linux/uaccess.h> |
| 40 | #include <linux/vmalloc.h> | 41 | #include <linux/vmalloc.h> |
| @@ -595,13 +596,20 @@ static int ioctl_send_request(struct client *client, void *buffer) | |||
| 595 | client->device->max_speed); | 596 | client->device->max_speed); |
| 596 | } | 597 | } |
| 597 | 598 | ||
| 599 | static inline bool is_fcp_request(struct fw_request *request) | ||
| 600 | { | ||
| 601 | return request == NULL; | ||
| 602 | } | ||
| 603 | |||
| 598 | static void release_request(struct client *client, | 604 | static void release_request(struct client *client, |
| 599 | struct client_resource *resource) | 605 | struct client_resource *resource) |
| 600 | { | 606 | { |
| 601 | struct inbound_transaction_resource *r = container_of(resource, | 607 | struct inbound_transaction_resource *r = container_of(resource, |
| 602 | struct inbound_transaction_resource, resource); | 608 | struct inbound_transaction_resource, resource); |
| 603 | 609 | ||
| 604 | if (r->request) | 610 | if (is_fcp_request(r->request)) |
| 611 | kfree(r->data); | ||
| 612 | else | ||
| 605 | fw_send_response(client->device->card, r->request, | 613 | fw_send_response(client->device->card, r->request, |
| 606 | RCODE_CONFLICT_ERROR); | 614 | RCODE_CONFLICT_ERROR); |
| 607 | kfree(r); | 615 | kfree(r); |
| @@ -616,6 +624,7 @@ static void handle_request(struct fw_card *card, struct fw_request *request, | |||
| 616 | struct address_handler_resource *handler = callback_data; | 624 | struct address_handler_resource *handler = callback_data; |
| 617 | struct inbound_transaction_resource *r; | 625 | struct inbound_transaction_resource *r; |
| 618 | struct inbound_transaction_event *e; | 626 | struct inbound_transaction_event *e; |
| 627 | void *fcp_frame = NULL; | ||
| 619 | int ret; | 628 | int ret; |
| 620 | 629 | ||
| 621 | r = kmalloc(sizeof(*r), GFP_ATOMIC); | 630 | r = kmalloc(sizeof(*r), GFP_ATOMIC); |
| @@ -627,6 +636,18 @@ static void handle_request(struct fw_card *card, struct fw_request *request, | |||
| 627 | r->data = payload; | 636 | r->data = payload; |
| 628 | r->length = length; | 637 | r->length = length; |
| 629 | 638 | ||
| 639 | if (is_fcp_request(request)) { | ||
| 640 | /* | ||
| 641 | * FIXME: Let core-transaction.c manage a | ||
| 642 | * single reference-counted copy? | ||
| 643 | */ | ||
| 644 | fcp_frame = kmemdup(payload, length, GFP_ATOMIC); | ||
| 645 | if (fcp_frame == NULL) | ||
| 646 | goto failed; | ||
| 647 | |||
| 648 | r->data = fcp_frame; | ||
| 649 | } | ||
| 650 | |||
| 630 | r->resource.release = release_request; | 651 | r->resource.release = release_request; |
| 631 | ret = add_client_resource(handler->client, &r->resource, GFP_ATOMIC); | 652 | ret = add_client_resource(handler->client, &r->resource, GFP_ATOMIC); |
| 632 | if (ret < 0) | 653 | if (ret < 0) |
| @@ -640,13 +661,15 @@ static void handle_request(struct fw_card *card, struct fw_request *request, | |||
| 640 | e->request.closure = handler->closure; | 661 | e->request.closure = handler->closure; |
| 641 | 662 | ||
| 642 | queue_event(handler->client, &e->event, | 663 | queue_event(handler->client, &e->event, |
| 643 | &e->request, sizeof(e->request), payload, length); | 664 | &e->request, sizeof(e->request), r->data, length); |
| 644 | return; | 665 | return; |
| 645 | 666 | ||
| 646 | failed: | 667 | failed: |
| 647 | kfree(r); | 668 | kfree(r); |
| 648 | kfree(e); | 669 | kfree(e); |
| 649 | if (request) | 670 | kfree(fcp_frame); |
| 671 | |||
| 672 | if (!is_fcp_request(request)) | ||
| 650 | fw_send_response(card, request, RCODE_CONFLICT_ERROR); | 673 | fw_send_response(card, request, RCODE_CONFLICT_ERROR); |
| 651 | } | 674 | } |
| 652 | 675 | ||
| @@ -717,18 +740,17 @@ static int ioctl_send_response(struct client *client, void *buffer) | |||
| 717 | 740 | ||
| 718 | r = container_of(resource, struct inbound_transaction_resource, | 741 | r = container_of(resource, struct inbound_transaction_resource, |
| 719 | resource); | 742 | resource); |
| 720 | if (r->request) { | 743 | if (is_fcp_request(r->request)) |
| 721 | if (request->length < r->length) | 744 | goto out; |
| 722 | r->length = request->length; | 745 | |
| 723 | if (copy_from_user(r->data, u64_to_uptr(request->data), | 746 | if (request->length < r->length) |
| 724 | r->length)) { | 747 | r->length = request->length; |
| 725 | ret = -EFAULT; | 748 | if (copy_from_user(r->data, u64_to_uptr(request->data), r->length)) { |
| 726 | kfree(r->request); | 749 | ret = -EFAULT; |
| 727 | goto out; | 750 | kfree(r->request); |
| 728 | } | 751 | goto out; |
| 729 | fw_send_response(client->device->card, r->request, | ||
| 730 | request->rcode); | ||
| 731 | } | 752 | } |
| 753 | fw_send_response(client->device->card, r->request, request->rcode); | ||
| 732 | out: | 754 | out: |
| 733 | kfree(r); | 755 | kfree(r); |
| 734 | 756 | ||
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index a61571c63c59..2345d4103fe6 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
| @@ -2420,6 +2420,7 @@ static void ohci_pmac_off(struct pci_dev *dev) | |||
| 2420 | 2420 | ||
| 2421 | #define PCI_VENDOR_ID_AGERE PCI_VENDOR_ID_ATT | 2421 | #define PCI_VENDOR_ID_AGERE PCI_VENDOR_ID_ATT |
| 2422 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 | 2422 | #define PCI_DEVICE_ID_AGERE_FW643 0x5901 |
| 2423 | #define PCI_DEVICE_ID_TI_TSB43AB23 0x8024 | ||
| 2423 | 2424 | ||
| 2424 | static int __devinit pci_probe(struct pci_dev *dev, | 2425 | static int __devinit pci_probe(struct pci_dev *dev, |
| 2425 | const struct pci_device_id *ent) | 2426 | const struct pci_device_id *ent) |
| @@ -2488,7 +2489,8 @@ static int __devinit pci_probe(struct pci_dev *dev, | |||
| 2488 | #if !defined(CONFIG_X86_32) | 2489 | #if !defined(CONFIG_X86_32) |
| 2489 | /* dual-buffer mode is broken with descriptor addresses above 2G */ | 2490 | /* dual-buffer mode is broken with descriptor addresses above 2G */ |
| 2490 | if (dev->vendor == PCI_VENDOR_ID_TI && | 2491 | if (dev->vendor == PCI_VENDOR_ID_TI && |
| 2491 | dev->device == PCI_DEVICE_ID_TI_TSB43AB22) | 2492 | (dev->device == PCI_DEVICE_ID_TI_TSB43AB22 || |
| 2493 | dev->device == PCI_DEVICE_ID_TI_TSB43AB23)) | ||
| 2492 | ohci->use_dualbuffer = false; | 2494 | ohci->use_dualbuffer = false; |
| 2493 | #endif | 2495 | #endif |
| 2494 | 2496 | ||
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index e9dbb481c469..8bf3770f294e 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
| @@ -142,19 +142,6 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size) | |||
| 142 | if (IS_ERR(obj->filp)) | 142 | if (IS_ERR(obj->filp)) |
| 143 | goto free; | 143 | goto free; |
| 144 | 144 | ||
| 145 | /* Basically we want to disable the OOM killer and handle ENOMEM | ||
| 146 | * ourselves by sacrificing pages from cached buffers. | ||
| 147 | * XXX shmem_file_[gs]et_gfp_mask() | ||
| 148 | */ | ||
| 149 | mapping_set_gfp_mask(obj->filp->f_path.dentry->d_inode->i_mapping, | ||
| 150 | GFP_HIGHUSER | | ||
| 151 | __GFP_COLD | | ||
| 152 | __GFP_FS | | ||
| 153 | __GFP_RECLAIMABLE | | ||
| 154 | __GFP_NORETRY | | ||
| 155 | __GFP_NOWARN | | ||
| 156 | __GFP_NOMEMALLOC); | ||
| 157 | |||
| 158 | kref_init(&obj->refcount); | 145 | kref_init(&obj->refcount); |
| 159 | kref_init(&obj->handlecount); | 146 | kref_init(&obj->handlecount); |
| 160 | obj->size = size; | 147 | obj->size = size; |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 9c9998c4dceb..a894ade03093 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -290,7 +290,7 @@ static int i915_batchbuffer_info(struct seq_file *m, void *data) | |||
| 290 | list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { | 290 | list_for_each_entry(obj_priv, &dev_priv->mm.active_list, list) { |
| 291 | obj = obj_priv->obj; | 291 | obj = obj_priv->obj; |
| 292 | if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) { | 292 | if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) { |
| 293 | ret = i915_gem_object_get_pages(obj); | 293 | ret = i915_gem_object_get_pages(obj, 0); |
| 294 | if (ret) { | 294 | if (ret) { |
| 295 | DRM_ERROR("Failed to get pages: %d\n", ret); | 295 | DRM_ERROR("Failed to get pages: %d\n", ret); |
| 296 | spin_unlock(&dev_priv->mm.active_list_lock); | 296 | spin_unlock(&dev_priv->mm.active_list_lock); |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 2c1669488b5a..aaf934d96f21 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -872,7 +872,7 @@ int i915_gem_attach_phys_object(struct drm_device *dev, | |||
| 872 | void i915_gem_detach_phys_object(struct drm_device *dev, | 872 | void i915_gem_detach_phys_object(struct drm_device *dev, |
| 873 | struct drm_gem_object *obj); | 873 | struct drm_gem_object *obj); |
| 874 | void i915_gem_free_all_phys_object(struct drm_device *dev); | 874 | void i915_gem_free_all_phys_object(struct drm_device *dev); |
| 875 | int i915_gem_object_get_pages(struct drm_gem_object *obj); | 875 | int i915_gem_object_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); |
| 876 | void i915_gem_object_put_pages(struct drm_gem_object *obj); | 876 | void i915_gem_object_put_pages(struct drm_gem_object *obj); |
| 877 | void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv); | 877 | void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv); |
| 878 | void i915_gem_object_flush_write_domain(struct drm_gem_object *obj); | 878 | void i915_gem_object_flush_write_domain(struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 0c67924ca80c..dda787aafcc6 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -277,7 +277,7 @@ i915_gem_shmem_pread_fast(struct drm_device *dev, struct drm_gem_object *obj, | |||
| 277 | 277 | ||
| 278 | mutex_lock(&dev->struct_mutex); | 278 | mutex_lock(&dev->struct_mutex); |
| 279 | 279 | ||
| 280 | ret = i915_gem_object_get_pages(obj); | 280 | ret = i915_gem_object_get_pages(obj, 0); |
| 281 | if (ret != 0) | 281 | if (ret != 0) |
| 282 | goto fail_unlock; | 282 | goto fail_unlock; |
| 283 | 283 | ||
| @@ -321,40 +321,24 @@ fail_unlock: | |||
| 321 | return ret; | 321 | return ret; |
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | static inline gfp_t | ||
| 325 | i915_gem_object_get_page_gfp_mask (struct drm_gem_object *obj) | ||
| 326 | { | ||
| 327 | return mapping_gfp_mask(obj->filp->f_path.dentry->d_inode->i_mapping); | ||
| 328 | } | ||
| 329 | |||
| 330 | static inline void | ||
| 331 | i915_gem_object_set_page_gfp_mask (struct drm_gem_object *obj, gfp_t gfp) | ||
| 332 | { | ||
| 333 | mapping_set_gfp_mask(obj->filp->f_path.dentry->d_inode->i_mapping, gfp); | ||
| 334 | } | ||
| 335 | |||
| 336 | static int | 324 | static int |
| 337 | i915_gem_object_get_pages_or_evict(struct drm_gem_object *obj) | 325 | i915_gem_object_get_pages_or_evict(struct drm_gem_object *obj) |
| 338 | { | 326 | { |
| 339 | int ret; | 327 | int ret; |
| 340 | 328 | ||
| 341 | ret = i915_gem_object_get_pages(obj); | 329 | ret = i915_gem_object_get_pages(obj, __GFP_NORETRY | __GFP_NOWARN); |
| 342 | 330 | ||
| 343 | /* If we've insufficient memory to map in the pages, attempt | 331 | /* If we've insufficient memory to map in the pages, attempt |
| 344 | * to make some space by throwing out some old buffers. | 332 | * to make some space by throwing out some old buffers. |
| 345 | */ | 333 | */ |
| 346 | if (ret == -ENOMEM) { | 334 | if (ret == -ENOMEM) { |
| 347 | struct drm_device *dev = obj->dev; | 335 | struct drm_device *dev = obj->dev; |
| 348 | gfp_t gfp; | ||
| 349 | 336 | ||
| 350 | ret = i915_gem_evict_something(dev, obj->size); | 337 | ret = i915_gem_evict_something(dev, obj->size); |
| 351 | if (ret) | 338 | if (ret) |
| 352 | return ret; | 339 | return ret; |
| 353 | 340 | ||
| 354 | gfp = i915_gem_object_get_page_gfp_mask(obj); | 341 | ret = i915_gem_object_get_pages(obj, 0); |
| 355 | i915_gem_object_set_page_gfp_mask(obj, gfp & ~__GFP_NORETRY); | ||
| 356 | ret = i915_gem_object_get_pages(obj); | ||
| 357 | i915_gem_object_set_page_gfp_mask (obj, gfp); | ||
| 358 | } | 342 | } |
| 359 | 343 | ||
| 360 | return ret; | 344 | return ret; |
| @@ -790,7 +774,7 @@ i915_gem_shmem_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj, | |||
| 790 | 774 | ||
| 791 | mutex_lock(&dev->struct_mutex); | 775 | mutex_lock(&dev->struct_mutex); |
| 792 | 776 | ||
| 793 | ret = i915_gem_object_get_pages(obj); | 777 | ret = i915_gem_object_get_pages(obj, 0); |
| 794 | if (ret != 0) | 778 | if (ret != 0) |
| 795 | goto fail_unlock; | 779 | goto fail_unlock; |
| 796 | 780 | ||
| @@ -2230,7 +2214,8 @@ i915_gem_evict_something(struct drm_device *dev, int min_size) | |||
| 2230 | } | 2214 | } |
| 2231 | 2215 | ||
| 2232 | int | 2216 | int |
| 2233 | i915_gem_object_get_pages(struct drm_gem_object *obj) | 2217 | i915_gem_object_get_pages(struct drm_gem_object *obj, |
| 2218 | gfp_t gfpmask) | ||
| 2234 | { | 2219 | { |
| 2235 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | 2220 | struct drm_i915_gem_object *obj_priv = obj->driver_private; |
| 2236 | int page_count, i; | 2221 | int page_count, i; |
| @@ -2256,7 +2241,10 @@ i915_gem_object_get_pages(struct drm_gem_object *obj) | |||
| 2256 | inode = obj->filp->f_path.dentry->d_inode; | 2241 | inode = obj->filp->f_path.dentry->d_inode; |
| 2257 | mapping = inode->i_mapping; | 2242 | mapping = inode->i_mapping; |
| 2258 | for (i = 0; i < page_count; i++) { | 2243 | for (i = 0; i < page_count; i++) { |
| 2259 | page = read_mapping_page(mapping, i, NULL); | 2244 | page = read_cache_page_gfp(mapping, i, |
| 2245 | mapping_gfp_mask (mapping) | | ||
| 2246 | __GFP_COLD | | ||
| 2247 | gfpmask); | ||
| 2260 | if (IS_ERR(page)) { | 2248 | if (IS_ERR(page)) { |
| 2261 | ret = PTR_ERR(page); | 2249 | ret = PTR_ERR(page); |
| 2262 | i915_gem_object_put_pages(obj); | 2250 | i915_gem_object_put_pages(obj); |
| @@ -2579,7 +2567,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment) | |||
| 2579 | drm_i915_private_t *dev_priv = dev->dev_private; | 2567 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 2580 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | 2568 | struct drm_i915_gem_object *obj_priv = obj->driver_private; |
| 2581 | struct drm_mm_node *free_space; | 2569 | struct drm_mm_node *free_space; |
| 2582 | bool retry_alloc = false; | 2570 | gfp_t gfpmask = __GFP_NORETRY | __GFP_NOWARN; |
| 2583 | int ret; | 2571 | int ret; |
| 2584 | 2572 | ||
| 2585 | if (obj_priv->madv != I915_MADV_WILLNEED) { | 2573 | if (obj_priv->madv != I915_MADV_WILLNEED) { |
| @@ -2623,15 +2611,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment) | |||
| 2623 | DRM_INFO("Binding object of size %zd at 0x%08x\n", | 2611 | DRM_INFO("Binding object of size %zd at 0x%08x\n", |
| 2624 | obj->size, obj_priv->gtt_offset); | 2612 | obj->size, obj_priv->gtt_offset); |
| 2625 | #endif | 2613 | #endif |
| 2626 | if (retry_alloc) { | 2614 | ret = i915_gem_object_get_pages(obj, gfpmask); |
| 2627 | i915_gem_object_set_page_gfp_mask (obj, | ||
| 2628 | i915_gem_object_get_page_gfp_mask (obj) & ~__GFP_NORETRY); | ||
| 2629 | } | ||
| 2630 | ret = i915_gem_object_get_pages(obj); | ||
| 2631 | if (retry_alloc) { | ||
| 2632 | i915_gem_object_set_page_gfp_mask (obj, | ||
| 2633 | i915_gem_object_get_page_gfp_mask (obj) | __GFP_NORETRY); | ||
| 2634 | } | ||
| 2635 | if (ret) { | 2615 | if (ret) { |
| 2636 | drm_mm_put_block(obj_priv->gtt_space); | 2616 | drm_mm_put_block(obj_priv->gtt_space); |
| 2637 | obj_priv->gtt_space = NULL; | 2617 | obj_priv->gtt_space = NULL; |
| @@ -2641,9 +2621,9 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment) | |||
| 2641 | ret = i915_gem_evict_something(dev, obj->size); | 2621 | ret = i915_gem_evict_something(dev, obj->size); |
| 2642 | if (ret) { | 2622 | if (ret) { |
| 2643 | /* now try to shrink everyone else */ | 2623 | /* now try to shrink everyone else */ |
| 2644 | if (! retry_alloc) { | 2624 | if (gfpmask) { |
| 2645 | retry_alloc = true; | 2625 | gfpmask = 0; |
| 2646 | goto search_free; | 2626 | goto search_free; |
| 2647 | } | 2627 | } |
| 2648 | 2628 | ||
| 2649 | return ret; | 2629 | return ret; |
| @@ -4946,7 +4926,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev, | |||
| 4946 | if (!obj_priv->phys_obj) | 4926 | if (!obj_priv->phys_obj) |
| 4947 | return; | 4927 | return; |
| 4948 | 4928 | ||
| 4949 | ret = i915_gem_object_get_pages(obj); | 4929 | ret = i915_gem_object_get_pages(obj, 0); |
| 4950 | if (ret) | 4930 | if (ret) |
| 4951 | goto out; | 4931 | goto out; |
| 4952 | 4932 | ||
| @@ -5004,7 +4984,7 @@ i915_gem_attach_phys_object(struct drm_device *dev, | |||
| 5004 | obj_priv->phys_obj = dev_priv->mm.phys_objs[id - 1]; | 4984 | obj_priv->phys_obj = dev_priv->mm.phys_objs[id - 1]; |
| 5005 | obj_priv->phys_obj->cur_obj = obj; | 4985 | obj_priv->phys_obj->cur_obj = obj; |
| 5006 | 4986 | ||
| 5007 | ret = i915_gem_object_get_pages(obj); | 4987 | ret = i915_gem_object_get_pages(obj, 0); |
| 5008 | if (ret) { | 4988 | if (ret) { |
| 5009 | DRM_ERROR("failed to get page list\n"); | 4989 | DRM_ERROR("failed to get page list\n"); |
| 5010 | goto out; | 4990 | goto out; |
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 85bc6a685e36..44d2037e9e56 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -4330,6 +4330,8 @@ initChainBuffers(MPT_ADAPTER *ioc) | |||
| 4330 | 4330 | ||
| 4331 | if (ioc->bus_type == SPI) | 4331 | if (ioc->bus_type == SPI) |
| 4332 | num_chain *= MPT_SCSI_CAN_QUEUE; | 4332 | num_chain *= MPT_SCSI_CAN_QUEUE; |
| 4333 | else if (ioc->bus_type == SAS) | ||
| 4334 | num_chain *= MPT_SAS_CAN_QUEUE; | ||
| 4333 | else | 4335 | else |
| 4334 | num_chain *= MPT_FC_CAN_QUEUE; | 4336 | num_chain *= MPT_FC_CAN_QUEUE; |
| 4335 | 4337 | ||
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index f237ddbb2713..111ea41c4ecd 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c | |||
| @@ -853,7 +853,6 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd, | |||
| 853 | break; | 853 | break; |
| 854 | } | 854 | } |
| 855 | 855 | ||
| 856 | req.name[req.name_len] = '\0'; | ||
| 857 | err = verify_mkvol_req(ubi, &req); | 856 | err = verify_mkvol_req(ubi, &req); |
| 858 | if (err) | 857 | if (err) |
| 859 | break; | 858 | break; |
diff --git a/drivers/pci/pcie/aer/aer_inject.c b/drivers/pci/pcie/aer/aer_inject.c index 8c30a9544d61..223052b73563 100644 --- a/drivers/pci/pcie/aer/aer_inject.c +++ b/drivers/pci/pcie/aer/aer_inject.c | |||
| @@ -321,7 +321,7 @@ static int aer_inject(struct aer_error_inj *einj) | |||
| 321 | unsigned long flags; | 321 | unsigned long flags; |
| 322 | unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn); | 322 | unsigned int devfn = PCI_DEVFN(einj->dev, einj->fn); |
| 323 | int pos_cap_err, rp_pos_cap_err; | 323 | int pos_cap_err, rp_pos_cap_err; |
| 324 | u32 sever, mask; | 324 | u32 sever, cor_mask, uncor_mask; |
| 325 | int ret = 0; | 325 | int ret = 0; |
| 326 | 326 | ||
| 327 | dev = pci_get_domain_bus_and_slot((int)einj->domain, einj->bus, devfn); | 327 | dev = pci_get_domain_bus_and_slot((int)einj->domain, einj->bus, devfn); |
| @@ -339,6 +339,9 @@ static int aer_inject(struct aer_error_inj *einj) | |||
| 339 | goto out_put; | 339 | goto out_put; |
| 340 | } | 340 | } |
| 341 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_SEVER, &sever); | 341 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_SEVER, &sever); |
| 342 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_COR_MASK, &cor_mask); | ||
| 343 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_MASK, | ||
| 344 | &uncor_mask); | ||
| 342 | 345 | ||
| 343 | rp_pos_cap_err = pci_find_ext_capability(rpdev, PCI_EXT_CAP_ID_ERR); | 346 | rp_pos_cap_err = pci_find_ext_capability(rpdev, PCI_EXT_CAP_ID_ERR); |
| 344 | if (!rp_pos_cap_err) { | 347 | if (!rp_pos_cap_err) { |
| @@ -374,17 +377,14 @@ static int aer_inject(struct aer_error_inj *einj) | |||
| 374 | err->header_log2 = einj->header_log2; | 377 | err->header_log2 = einj->header_log2; |
| 375 | err->header_log3 = einj->header_log3; | 378 | err->header_log3 = einj->header_log3; |
| 376 | 379 | ||
| 377 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_COR_MASK, &mask); | 380 | if (einj->cor_status && !(einj->cor_status & ~cor_mask)) { |
| 378 | if (einj->cor_status && !(einj->cor_status & ~mask)) { | ||
| 379 | ret = -EINVAL; | 381 | ret = -EINVAL; |
| 380 | printk(KERN_WARNING "The correctable error(s) is masked " | 382 | printk(KERN_WARNING "The correctable error(s) is masked " |
| 381 | "by device\n"); | 383 | "by device\n"); |
| 382 | spin_unlock_irqrestore(&inject_lock, flags); | 384 | spin_unlock_irqrestore(&inject_lock, flags); |
| 383 | goto out_put; | 385 | goto out_put; |
| 384 | } | 386 | } |
| 385 | 387 | if (einj->uncor_status && !(einj->uncor_status & ~uncor_mask)) { | |
| 386 | pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_MASK, &mask); | ||
| 387 | if (einj->uncor_status && !(einj->uncor_status & ~mask)) { | ||
| 388 | ret = -EINVAL; | 388 | ret = -EINVAL; |
| 389 | printk(KERN_WARNING "The uncorrectable error(s) is masked " | 389 | printk(KERN_WARNING "The uncorrectable error(s) is masked " |
| 390 | "by device\n"); | 390 | "by device\n"); |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index fdb2e7c14506..5905936c7c60 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -1004,8 +1004,8 @@ static void dasd_handle_killed_request(struct ccw_device *cdev, | |||
| 1004 | if (device == NULL || | 1004 | if (device == NULL || |
| 1005 | device != dasd_device_from_cdev_locked(cdev) || | 1005 | device != dasd_device_from_cdev_locked(cdev) || |
| 1006 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { | 1006 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { |
| 1007 | DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: " | 1007 | DBF_EVENT_DEVID(DBF_DEBUG, cdev, "%s", |
| 1008 | "bus_id %s", dev_name(&cdev->dev)); | 1008 | "invalid device in request"); |
| 1009 | return; | 1009 | return; |
| 1010 | } | 1010 | } |
| 1011 | 1011 | ||
| @@ -1078,8 +1078,8 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 1078 | device = (struct dasd_device *) cqr->startdev; | 1078 | device = (struct dasd_device *) cqr->startdev; |
| 1079 | if (!device || | 1079 | if (!device || |
| 1080 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { | 1080 | strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { |
| 1081 | DBF_DEV_EVENT(DBF_DEBUG, device, "invalid device in request: " | 1081 | DBF_EVENT_DEVID(DBF_DEBUG, cdev, "%s", |
| 1082 | "bus_id %s", dev_name(&cdev->dev)); | 1082 | "invalid device in request"); |
| 1083 | return; | 1083 | return; |
| 1084 | } | 1084 | } |
| 1085 | 1085 | ||
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 1c500c462225..1cca21aafaba 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
| @@ -3033,7 +3033,7 @@ static void dasd_eckd_dump_sense_ccw(struct dasd_device *device, | |||
| 3033 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 3033 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER |
| 3034 | " in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d\n", | 3034 | " in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d\n", |
| 3035 | req, scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw), | 3035 | req, scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw), |
| 3036 | scsw_cc(&irb->scsw), req->intrc); | 3036 | scsw_cc(&irb->scsw), req ? req->intrc : 0); |
| 3037 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER | 3037 | len += sprintf(page + len, KERN_ERR PRINTK_HEADER |
| 3038 | " device %s: Failing CCW: %p\n", | 3038 | " device %s: Failing CCW: %p\n", |
| 3039 | dev_name(&device->cdev->dev), | 3039 | dev_name(&device->cdev->dev), |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index fc7b30b4a255..7039d9cf0fb4 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
| @@ -260,7 +260,7 @@ static int dasd_ioctl_information(struct dasd_block *block, | |||
| 260 | struct ccw_dev_id dev_id; | 260 | struct ccw_dev_id dev_id; |
| 261 | 261 | ||
| 262 | base = block->base; | 262 | base = block->base; |
| 263 | if (!base->discipline->fill_info) | 263 | if (!base->discipline || !base->discipline->fill_info) |
| 264 | return -EINVAL; | 264 | return -EINVAL; |
| 265 | 265 | ||
| 266 | dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); | 266 | dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL); |
| @@ -303,10 +303,7 @@ static int dasd_ioctl_information(struct dasd_block *block, | |||
| 303 | dasd_info->features |= | 303 | dasd_info->features |= |
| 304 | ((base->features & DASD_FEATURE_READONLY) != 0); | 304 | ((base->features & DASD_FEATURE_READONLY) != 0); |
| 305 | 305 | ||
| 306 | if (base->discipline) | 306 | memcpy(dasd_info->type, base->discipline->name, 4); |
| 307 | memcpy(dasd_info->type, base->discipline->name, 4); | ||
| 308 | else | ||
| 309 | memcpy(dasd_info->type, "none", 4); | ||
| 310 | 307 | ||
| 311 | if (block->request_queue->request_fn) { | 308 | if (block->request_queue->request_fn) { |
| 312 | struct list_head *l; | 309 | struct list_head *l; |
diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index 6315fbd8e68b..71f95f54866f 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c | |||
| @@ -72,7 +72,7 @@ dasd_devices_show(struct seq_file *m, void *v) | |||
| 72 | /* Print device number. */ | 72 | /* Print device number. */ |
| 73 | seq_printf(m, "%s", dev_name(&device->cdev->dev)); | 73 | seq_printf(m, "%s", dev_name(&device->cdev->dev)); |
| 74 | /* Print discipline string. */ | 74 | /* Print discipline string. */ |
| 75 | if (device != NULL && device->discipline != NULL) | 75 | if (device->discipline != NULL) |
| 76 | seq_printf(m, "(%s)", device->discipline->name); | 76 | seq_printf(m, "(%s)", device->discipline->name); |
| 77 | else | 77 | else |
| 78 | seq_printf(m, "(none)"); | 78 | seq_printf(m, "(none)"); |
| @@ -92,10 +92,7 @@ dasd_devices_show(struct seq_file *m, void *v) | |||
| 92 | substr = (device->features & DASD_FEATURE_READONLY) ? "(ro)" : " "; | 92 | substr = (device->features & DASD_FEATURE_READONLY) ? "(ro)" : " "; |
| 93 | seq_printf(m, "%4s: ", substr); | 93 | seq_printf(m, "%4s: ", substr); |
| 94 | /* Print device status information. */ | 94 | /* Print device status information. */ |
| 95 | switch ((device != NULL) ? device->state : -1) { | 95 | switch (device->state) { |
| 96 | case -1: | ||
| 97 | seq_printf(m, "unknown"); | ||
| 98 | break; | ||
| 99 | case DASD_STATE_NEW: | 96 | case DASD_STATE_NEW: |
| 100 | seq_printf(m, "new"); | 97 | seq_printf(m, "new"); |
| 101 | break; | 98 | break; |
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index b9d2a007e93b..3796ffdb8479 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
| @@ -495,6 +495,10 @@ sclp_vt220_open(struct tty_struct *tty, struct file *filp) | |||
| 495 | if (tty->driver_data == NULL) | 495 | if (tty->driver_data == NULL) |
| 496 | return -ENOMEM; | 496 | return -ENOMEM; |
| 497 | tty->low_latency = 0; | 497 | tty->low_latency = 0; |
| 498 | if (!tty->winsize.ws_row && !tty->winsize.ws_col) { | ||
| 499 | tty->winsize.ws_row = 24; | ||
| 500 | tty->winsize.ws_col = 80; | ||
| 501 | } | ||
| 498 | } | 502 | } |
| 499 | return 0; | 503 | return 0; |
| 500 | } | 504 | } |
diff --git a/drivers/s390/crypto/zcrypt_pcicc.c b/drivers/s390/crypto/zcrypt_pcicc.c index a23726a0735c..142f72a2ca5a 100644 --- a/drivers/s390/crypto/zcrypt_pcicc.c +++ b/drivers/s390/crypto/zcrypt_pcicc.c | |||
| @@ -373,6 +373,8 @@ static int convert_type86(struct zcrypt_device *zdev, | |||
| 373 | zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD; | 373 | zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD; |
| 374 | return -EAGAIN; | 374 | return -EAGAIN; |
| 375 | } | 375 | } |
| 376 | if (service_rc == 8 && service_rs == 72) | ||
| 377 | return -EINVAL; | ||
| 376 | zdev->online = 0; | 378 | zdev->online = 0; |
| 377 | return -EAGAIN; /* repeat the request on a different device. */ | 379 | return -EAGAIN; /* repeat the request on a different device. */ |
| 378 | } | 380 | } |
diff --git a/drivers/s390/crypto/zcrypt_pcixcc.c b/drivers/s390/crypto/zcrypt_pcixcc.c index 79c120578e61..68f3e6204db8 100644 --- a/drivers/s390/crypto/zcrypt_pcixcc.c +++ b/drivers/s390/crypto/zcrypt_pcixcc.c | |||
| @@ -470,6 +470,8 @@ static int convert_type86_ica(struct zcrypt_device *zdev, | |||
| 470 | } | 470 | } |
| 471 | if (service_rc == 12 && service_rs == 769) | 471 | if (service_rc == 12 && service_rs == 769) |
| 472 | return -EINVAL; | 472 | return -EINVAL; |
| 473 | if (service_rc == 8 && service_rs == 72) | ||
| 474 | return -EINVAL; | ||
| 473 | zdev->online = 0; | 475 | zdev->online = 0; |
| 474 | return -EAGAIN; /* repeat the request on a different device. */ | 476 | return -EAGAIN; /* repeat the request on a different device. */ |
| 475 | } | 477 | } |
diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c index f932400e980a..0eb6eefd2c1a 100644 --- a/drivers/s390/scsi/zfcp_cfdc.c +++ b/drivers/s390/scsi/zfcp_cfdc.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| 14 | #include <linux/miscdevice.h> | 14 | #include <linux/miscdevice.h> |
| 15 | #include <asm/compat.h> | ||
| 15 | #include <asm/ccwdev.h> | 16 | #include <asm/ccwdev.h> |
| 16 | #include "zfcp_def.h" | 17 | #include "zfcp_def.h" |
| 17 | #include "zfcp_ext.h" | 18 | #include "zfcp_ext.h" |
| @@ -163,7 +164,7 @@ static void zfcp_cfdc_req_to_sense(struct zfcp_cfdc_data *data, | |||
| 163 | } | 164 | } |
| 164 | 165 | ||
| 165 | static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, | 166 | static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, |
| 166 | unsigned long buffer) | 167 | unsigned long arg) |
| 167 | { | 168 | { |
| 168 | struct zfcp_cfdc_data *data; | 169 | struct zfcp_cfdc_data *data; |
| 169 | struct zfcp_cfdc_data __user *data_user; | 170 | struct zfcp_cfdc_data __user *data_user; |
| @@ -175,7 +176,11 @@ static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command, | |||
| 175 | if (command != ZFCP_CFDC_IOC) | 176 | if (command != ZFCP_CFDC_IOC) |
| 176 | return -ENOTTY; | 177 | return -ENOTTY; |
| 177 | 178 | ||
| 178 | data_user = (void __user *) buffer; | 179 | if (is_compat_task()) |
| 180 | data_user = compat_ptr(arg); | ||
| 181 | else | ||
| 182 | data_user = (void __user *)arg; | ||
| 183 | |||
| 179 | if (!data_user) | 184 | if (!data_user) |
| 180 | return -EINVAL; | 185 | return -EINVAL; |
| 181 | 186 | ||
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 84450955ae11..7369c8911bcf 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
| @@ -327,7 +327,7 @@ static void zfcp_dbf_hba_view_response(char **p, | |||
| 327 | break; | 327 | break; |
| 328 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); | 328 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); |
| 329 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); | 329 | zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial); |
| 330 | p += sprintf(*p, "\n"); | 330 | *p += sprintf(*p, "\n"); |
| 331 | break; | 331 | break; |
| 332 | 332 | ||
| 333 | case FSF_QTCB_OPEN_PORT_WITH_DID: | 333 | case FSF_QTCB_OPEN_PORT_WITH_DID: |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 03dec832b465..66bdb34143cb 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
| @@ -108,6 +108,7 @@ extern void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *); | |||
| 108 | extern int zfcp_fc_gs_setup(struct zfcp_adapter *); | 108 | extern int zfcp_fc_gs_setup(struct zfcp_adapter *); |
| 109 | extern void zfcp_fc_gs_destroy(struct zfcp_adapter *); | 109 | extern void zfcp_fc_gs_destroy(struct zfcp_adapter *); |
| 110 | extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *); | 110 | extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *); |
| 111 | extern int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *); | ||
| 111 | 112 | ||
| 112 | /* zfcp_fsf.c */ | 113 | /* zfcp_fsf.c */ |
| 113 | extern int zfcp_fsf_open_port(struct zfcp_erp_action *); | 114 | extern int zfcp_fsf_open_port(struct zfcp_erp_action *); |
| @@ -129,9 +130,9 @@ extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *); | |||
| 129 | extern int zfcp_fsf_status_read(struct zfcp_qdio *); | 130 | extern int zfcp_fsf_status_read(struct zfcp_qdio *); |
| 130 | extern int zfcp_status_read_refill(struct zfcp_adapter *adapter); | 131 | extern int zfcp_status_read_refill(struct zfcp_adapter *adapter); |
| 131 | extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *, | 132 | extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *, |
| 132 | mempool_t *); | 133 | mempool_t *, unsigned int); |
| 133 | extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32, | 134 | extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32, |
| 134 | struct zfcp_fsf_ct_els *); | 135 | struct zfcp_fsf_ct_els *, unsigned int); |
| 135 | extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *, | 136 | extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *, |
| 136 | struct scsi_cmnd *); | 137 | struct scsi_cmnd *); |
| 137 | extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); | 138 | extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index ac5e3b7a3576..0f7b493fb105 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -258,7 +258,8 @@ static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port, | |||
| 258 | gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn; | 258 | gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn; |
| 259 | 259 | ||
| 260 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct, | 260 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct, |
| 261 | adapter->pool.gid_pn_req); | 261 | adapter->pool.gid_pn_req, |
| 262 | ZFCP_FC_CTELS_TMO); | ||
| 262 | if (!ret) { | 263 | if (!ret) { |
| 263 | wait_for_completion(&completion); | 264 | wait_for_completion(&completion); |
| 264 | zfcp_fc_ns_gid_pn_eval(gid_pn); | 265 | zfcp_fc_ns_gid_pn_eval(gid_pn); |
| @@ -421,7 +422,8 @@ static int zfcp_fc_adisc(struct zfcp_port *port) | |||
| 421 | hton24(adisc->adisc_req.adisc_port_id, | 422 | hton24(adisc->adisc_req.adisc_port_id, |
| 422 | fc_host_port_id(adapter->scsi_host)); | 423 | fc_host_port_id(adapter->scsi_host)); |
| 423 | 424 | ||
| 424 | ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els); | 425 | ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els, |
| 426 | ZFCP_FC_CTELS_TMO); | ||
| 425 | if (ret) | 427 | if (ret) |
| 426 | kmem_cache_free(zfcp_data.adisc_cache, adisc); | 428 | kmem_cache_free(zfcp_data.adisc_cache, adisc); |
| 427 | 429 | ||
| @@ -532,7 +534,8 @@ static int zfcp_fc_send_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft, | |||
| 532 | ct->req = &gpn_ft->sg_req; | 534 | ct->req = &gpn_ft->sg_req; |
| 533 | ct->resp = gpn_ft->sg_resp; | 535 | ct->resp = gpn_ft->sg_resp; |
| 534 | 536 | ||
| 535 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL); | 537 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL, |
| 538 | ZFCP_FC_CTELS_TMO); | ||
| 536 | if (!ret) | 539 | if (!ret) |
| 537 | wait_for_completion(&completion); | 540 | wait_for_completion(&completion); |
| 538 | return ret; | 541 | return ret; |
| @@ -677,6 +680,44 @@ static void zfcp_fc_ct_els_job_handler(void *data) | |||
| 677 | job->job_done(job); | 680 | job->job_done(job); |
| 678 | } | 681 | } |
| 679 | 682 | ||
| 683 | static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job) | ||
| 684 | { | ||
| 685 | u32 preamble_word1; | ||
| 686 | u8 gs_type; | ||
| 687 | struct zfcp_adapter *adapter; | ||
| 688 | |||
| 689 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | ||
| 690 | gs_type = (preamble_word1 & 0xff000000) >> 24; | ||
| 691 | |||
| 692 | adapter = (struct zfcp_adapter *) job->shost->hostdata[0]; | ||
| 693 | |||
| 694 | switch (gs_type) { | ||
| 695 | case FC_FST_ALIAS: | ||
| 696 | return &adapter->gs->as; | ||
| 697 | case FC_FST_MGMT: | ||
| 698 | return &adapter->gs->ms; | ||
| 699 | case FC_FST_TIME: | ||
| 700 | return &adapter->gs->ts; | ||
| 701 | break; | ||
| 702 | case FC_FST_DIR: | ||
| 703 | return &adapter->gs->ds; | ||
| 704 | break; | ||
| 705 | default: | ||
| 706 | return NULL; | ||
| 707 | } | ||
| 708 | } | ||
| 709 | |||
| 710 | static void zfcp_fc_ct_job_handler(void *data) | ||
| 711 | { | ||
| 712 | struct fc_bsg_job *job = data; | ||
| 713 | struct zfcp_fc_wka_port *wka_port; | ||
| 714 | |||
| 715 | wka_port = zfcp_fc_job_wka_port(job); | ||
| 716 | zfcp_fc_wka_port_put(wka_port); | ||
| 717 | |||
| 718 | zfcp_fc_ct_els_job_handler(data); | ||
| 719 | } | ||
| 720 | |||
| 680 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | 721 | static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, |
| 681 | struct zfcp_adapter *adapter) | 722 | struct zfcp_adapter *adapter) |
| 682 | { | 723 | { |
| @@ -695,43 +736,27 @@ static int zfcp_fc_exec_els_job(struct fc_bsg_job *job, | |||
| 695 | } else | 736 | } else |
| 696 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); | 737 | d_id = ntoh24(job->request->rqst_data.h_els.port_id); |
| 697 | 738 | ||
| 698 | return zfcp_fsf_send_els(adapter, d_id, els); | 739 | els->handler = zfcp_fc_ct_els_job_handler; |
| 740 | return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ); | ||
| 699 | } | 741 | } |
| 700 | 742 | ||
| 701 | static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job, | 743 | static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job, |
| 702 | struct zfcp_adapter *adapter) | 744 | struct zfcp_adapter *adapter) |
| 703 | { | 745 | { |
| 704 | int ret; | 746 | int ret; |
| 705 | u8 gs_type; | ||
| 706 | struct zfcp_fsf_ct_els *ct = job->dd_data; | 747 | struct zfcp_fsf_ct_els *ct = job->dd_data; |
| 707 | struct zfcp_fc_wka_port *wka_port; | 748 | struct zfcp_fc_wka_port *wka_port; |
| 708 | u32 preamble_word1; | ||
| 709 | 749 | ||
| 710 | preamble_word1 = job->request->rqst_data.r_ct.preamble_word1; | 750 | wka_port = zfcp_fc_job_wka_port(job); |
| 711 | gs_type = (preamble_word1 & 0xff000000) >> 24; | 751 | if (!wka_port) |
| 712 | 752 | return -EINVAL; | |
| 713 | switch (gs_type) { | ||
| 714 | case FC_FST_ALIAS: | ||
| 715 | wka_port = &adapter->gs->as; | ||
| 716 | break; | ||
| 717 | case FC_FST_MGMT: | ||
| 718 | wka_port = &adapter->gs->ms; | ||
| 719 | break; | ||
| 720 | case FC_FST_TIME: | ||
| 721 | wka_port = &adapter->gs->ts; | ||
| 722 | break; | ||
| 723 | case FC_FST_DIR: | ||
| 724 | wka_port = &adapter->gs->ds; | ||
| 725 | break; | ||
| 726 | default: | ||
| 727 | return -EINVAL; /* no such service */ | ||
| 728 | } | ||
| 729 | 753 | ||
| 730 | ret = zfcp_fc_wka_port_get(wka_port); | 754 | ret = zfcp_fc_wka_port_get(wka_port); |
| 731 | if (ret) | 755 | if (ret) |
| 732 | return ret; | 756 | return ret; |
| 733 | 757 | ||
| 734 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL); | 758 | ct->handler = zfcp_fc_ct_job_handler; |
| 759 | ret = zfcp_fsf_send_ct(wka_port, ct, NULL, job->req->timeout / HZ); | ||
| 735 | if (ret) | 760 | if (ret) |
| 736 | zfcp_fc_wka_port_put(wka_port); | 761 | zfcp_fc_wka_port_put(wka_port); |
| 737 | 762 | ||
| @@ -752,7 +777,6 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job) | |||
| 752 | 777 | ||
| 753 | ct_els->req = job->request_payload.sg_list; | 778 | ct_els->req = job->request_payload.sg_list; |
| 754 | ct_els->resp = job->reply_payload.sg_list; | 779 | ct_els->resp = job->reply_payload.sg_list; |
| 755 | ct_els->handler = zfcp_fc_ct_els_job_handler; | ||
| 756 | ct_els->handler_data = job; | 780 | ct_els->handler_data = job; |
| 757 | 781 | ||
| 758 | switch (job->request->msgcode) { | 782 | switch (job->request->msgcode) { |
| @@ -767,6 +791,12 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job) | |||
| 767 | } | 791 | } |
| 768 | } | 792 | } |
| 769 | 793 | ||
| 794 | int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job) | ||
| 795 | { | ||
| 796 | /* hardware tracks timeout, reset bsg timeout to not interfere */ | ||
| 797 | return -EAGAIN; | ||
| 798 | } | ||
| 799 | |||
| 770 | int zfcp_fc_gs_setup(struct zfcp_adapter *adapter) | 800 | int zfcp_fc_gs_setup(struct zfcp_adapter *adapter) |
| 771 | { | 801 | { |
| 772 | struct zfcp_fc_wka_ports *wka_ports; | 802 | struct zfcp_fc_wka_ports *wka_ports; |
diff --git a/drivers/s390/scsi/zfcp_fc.h b/drivers/s390/scsi/zfcp_fc.h index cb2a3669a384..0747b087390d 100644 --- a/drivers/s390/scsi/zfcp_fc.h +++ b/drivers/s390/scsi/zfcp_fc.h | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #define ZFCP_FC_GPN_FT_MAX_ENT (ZFCP_FC_GPN_FT_NUM_BUFS * \ | 27 | #define ZFCP_FC_GPN_FT_MAX_ENT (ZFCP_FC_GPN_FT_NUM_BUFS * \ |
| 28 | (ZFCP_FC_GPN_FT_ENT_PAGE + 1)) | 28 | (ZFCP_FC_GPN_FT_ENT_PAGE + 1)) |
| 29 | 29 | ||
| 30 | #define ZFCP_FC_CTELS_TMO (2 * FC_DEF_R_A_TOV / 1000) | ||
| 31 | |||
| 30 | /** | 32 | /** |
| 31 | * struct zfcp_fc_gid_pn_req - container for ct header plus gid_pn request | 33 | * struct zfcp_fc_gid_pn_req - container for ct header plus gid_pn request |
| 32 | * @ct_hdr: FC GS common transport header | 34 | * @ct_hdr: FC GS common transport header |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 482dcd97aa5d..e8fb4d9baa8b 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -1068,20 +1068,20 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, | |||
| 1068 | static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, | 1068 | static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, |
| 1069 | struct scatterlist *sg_req, | 1069 | struct scatterlist *sg_req, |
| 1070 | struct scatterlist *sg_resp, | 1070 | struct scatterlist *sg_resp, |
| 1071 | int max_sbals) | 1071 | int max_sbals, unsigned int timeout) |
| 1072 | { | 1072 | { |
| 1073 | int ret; | 1073 | int ret; |
| 1074 | unsigned int fcp_chan_timeout; | ||
| 1075 | 1074 | ||
| 1076 | ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals); | 1075 | ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals); |
| 1077 | if (ret) | 1076 | if (ret) |
| 1078 | return ret; | 1077 | return ret; |
| 1079 | 1078 | ||
| 1080 | /* common settings for ct/gs and els requests */ | 1079 | /* common settings for ct/gs and els requests */ |
| 1081 | fcp_chan_timeout = 2 * FC_DEF_R_A_TOV / 1000; | 1080 | if (timeout > 255) |
| 1081 | timeout = 255; /* max value accepted by hardware */ | ||
| 1082 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; | 1082 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; |
| 1083 | req->qtcb->bottom.support.timeout = fcp_chan_timeout; | 1083 | req->qtcb->bottom.support.timeout = timeout; |
| 1084 | zfcp_fsf_start_timer(req, (fcp_chan_timeout + 10) * HZ); | 1084 | zfcp_fsf_start_timer(req, (timeout + 10) * HZ); |
| 1085 | 1085 | ||
| 1086 | return 0; | 1086 | return 0; |
| 1087 | } | 1087 | } |
| @@ -1092,7 +1092,8 @@ static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, | |||
| 1092 | * @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req | 1092 | * @pool: if non-null this mempool is used to allocate struct zfcp_fsf_req |
| 1093 | */ | 1093 | */ |
| 1094 | int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | 1094 | int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, |
| 1095 | struct zfcp_fsf_ct_els *ct, mempool_t *pool) | 1095 | struct zfcp_fsf_ct_els *ct, mempool_t *pool, |
| 1096 | unsigned int timeout) | ||
| 1096 | { | 1097 | { |
| 1097 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; | 1098 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
| 1098 | struct zfcp_fsf_req *req; | 1099 | struct zfcp_fsf_req *req; |
| @@ -1111,7 +1112,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | |||
| 1111 | 1112 | ||
| 1112 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1113 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
| 1113 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, | 1114 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, |
| 1114 | FSF_MAX_SBALS_PER_REQ); | 1115 | FSF_MAX_SBALS_PER_REQ, timeout); |
| 1115 | if (ret) | 1116 | if (ret) |
| 1116 | goto failed_send; | 1117 | goto failed_send; |
| 1117 | 1118 | ||
| @@ -1188,7 +1189,7 @@ skip_fsfstatus: | |||
| 1188 | * @els: pointer to struct zfcp_send_els with data for the command | 1189 | * @els: pointer to struct zfcp_send_els with data for the command |
| 1189 | */ | 1190 | */ |
| 1190 | int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | 1191 | int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, |
| 1191 | struct zfcp_fsf_ct_els *els) | 1192 | struct zfcp_fsf_ct_els *els, unsigned int timeout) |
| 1192 | { | 1193 | { |
| 1193 | struct zfcp_fsf_req *req; | 1194 | struct zfcp_fsf_req *req; |
| 1194 | struct zfcp_qdio *qdio = adapter->qdio; | 1195 | struct zfcp_qdio *qdio = adapter->qdio; |
| @@ -1206,7 +1207,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | |||
| 1206 | } | 1207 | } |
| 1207 | 1208 | ||
| 1208 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1209 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
| 1209 | ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2); | 1210 | ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2, timeout); |
| 1210 | 1211 | ||
| 1211 | if (ret) | 1212 | if (ret) |
| 1212 | goto failed_send; | 1213 | goto failed_send; |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 771cc536a989..8e6fc68d6bd4 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -652,6 +652,7 @@ struct fc_function_template zfcp_transport_functions = { | |||
| 652 | .show_host_port_state = 1, | 652 | .show_host_port_state = 1, |
| 653 | .show_host_active_fc4s = 1, | 653 | .show_host_active_fc4s = 1, |
| 654 | .bsg_request = zfcp_fc_exec_bsg_job, | 654 | .bsg_request = zfcp_fc_exec_bsg_job, |
| 655 | .bsg_timeout = zfcp_fc_timeout_bsg_job, | ||
| 655 | /* no functions registered for following dynamic attributes but | 656 | /* no functions registered for following dynamic attributes but |
| 656 | directly set by LLDD */ | 657 | directly set by LLDD */ |
| 657 | .show_host_port_type = 1, | 658 | .show_host_port_type = 1, |
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 2a889853a106..7e26ebc26661 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
| @@ -293,7 +293,10 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
| 293 | status = -EINVAL; | 293 | status = -EINVAL; |
| 294 | } | 294 | } |
| 295 | } | 295 | } |
| 296 | aac_fib_complete(fibptr); | 296 | /* Do not set XferState to zero unless receives a response from F/W */ |
| 297 | if (status >= 0) | ||
| 298 | aac_fib_complete(fibptr); | ||
| 299 | |||
| 297 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ | 300 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ |
| 298 | if (status >= 0) { | 301 | if (status >= 0) { |
| 299 | if ((aac_commit == 1) || commit_flag) { | 302 | if ((aac_commit == 1) || commit_flag) { |
| @@ -310,13 +313,18 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
| 310 | FsaNormal, | 313 | FsaNormal, |
| 311 | 1, 1, | 314 | 1, 1, |
| 312 | NULL, NULL); | 315 | NULL, NULL); |
| 313 | aac_fib_complete(fibptr); | 316 | /* Do not set XferState to zero unless |
| 317 | * receives a response from F/W */ | ||
| 318 | if (status >= 0) | ||
| 319 | aac_fib_complete(fibptr); | ||
| 314 | } else if (aac_commit == 0) { | 320 | } else if (aac_commit == 0) { |
| 315 | printk(KERN_WARNING | 321 | printk(KERN_WARNING |
| 316 | "aac_get_config_status: Foreign device configurations are being ignored\n"); | 322 | "aac_get_config_status: Foreign device configurations are being ignored\n"); |
| 317 | } | 323 | } |
| 318 | } | 324 | } |
| 319 | aac_fib_free(fibptr); | 325 | /* FIB should be freed only after getting the response from the F/W */ |
| 326 | if (status != -ERESTARTSYS) | ||
| 327 | aac_fib_free(fibptr); | ||
| 320 | return status; | 328 | return status; |
| 321 | } | 329 | } |
| 322 | 330 | ||
| @@ -355,7 +363,9 @@ int aac_get_containers(struct aac_dev *dev) | |||
| 355 | maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries); | 363 | maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries); |
| 356 | aac_fib_complete(fibptr); | 364 | aac_fib_complete(fibptr); |
| 357 | } | 365 | } |
| 358 | aac_fib_free(fibptr); | 366 | /* FIB should be freed only after getting the response from the F/W */ |
| 367 | if (status != -ERESTARTSYS) | ||
| 368 | aac_fib_free(fibptr); | ||
| 359 | 369 | ||
| 360 | if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS) | 370 | if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS) |
| 361 | maximum_num_containers = MAXIMUM_NUM_CONTAINERS; | 371 | maximum_num_containers = MAXIMUM_NUM_CONTAINERS; |
| @@ -1245,8 +1255,12 @@ int aac_get_adapter_info(struct aac_dev* dev) | |||
| 1245 | NULL); | 1255 | NULL); |
| 1246 | 1256 | ||
| 1247 | if (rcode < 0) { | 1257 | if (rcode < 0) { |
| 1248 | aac_fib_complete(fibptr); | 1258 | /* FIB should be freed only after |
| 1249 | aac_fib_free(fibptr); | 1259 | * getting the response from the F/W */ |
| 1260 | if (rcode != -ERESTARTSYS) { | ||
| 1261 | aac_fib_complete(fibptr); | ||
| 1262 | aac_fib_free(fibptr); | ||
| 1263 | } | ||
| 1250 | return rcode; | 1264 | return rcode; |
| 1251 | } | 1265 | } |
| 1252 | memcpy(&dev->adapter_info, info, sizeof(*info)); | 1266 | memcpy(&dev->adapter_info, info, sizeof(*info)); |
| @@ -1270,6 +1284,12 @@ int aac_get_adapter_info(struct aac_dev* dev) | |||
| 1270 | 1284 | ||
| 1271 | if (rcode >= 0) | 1285 | if (rcode >= 0) |
| 1272 | memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo)); | 1286 | memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo)); |
| 1287 | if (rcode == -ERESTARTSYS) { | ||
| 1288 | fibptr = aac_fib_alloc(dev); | ||
| 1289 | if (!fibptr) | ||
| 1290 | return -ENOMEM; | ||
| 1291 | } | ||
| 1292 | |||
| 1273 | } | 1293 | } |
| 1274 | 1294 | ||
| 1275 | 1295 | ||
| @@ -1470,9 +1490,11 @@ int aac_get_adapter_info(struct aac_dev* dev) | |||
| 1470 | (dev->scsi_host_ptr->sg_tablesize * 8) + 112; | 1490 | (dev->scsi_host_ptr->sg_tablesize * 8) + 112; |
| 1471 | } | 1491 | } |
| 1472 | } | 1492 | } |
| 1473 | 1493 | /* FIB should be freed only after getting the response from the F/W */ | |
| 1474 | aac_fib_complete(fibptr); | 1494 | if (rcode != -ERESTARTSYS) { |
| 1475 | aac_fib_free(fibptr); | 1495 | aac_fib_complete(fibptr); |
| 1496 | aac_fib_free(fibptr); | ||
| 1497 | } | ||
| 1476 | 1498 | ||
| 1477 | return rcode; | 1499 | return rcode; |
| 1478 | } | 1500 | } |
| @@ -1633,6 +1655,7 @@ static int aac_read(struct scsi_cmnd * scsicmd) | |||
| 1633 | * Alocate and initialize a Fib | 1655 | * Alocate and initialize a Fib |
| 1634 | */ | 1656 | */ |
| 1635 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { | 1657 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { |
| 1658 | printk(KERN_WARNING "aac_read: fib allocation failed\n"); | ||
| 1636 | return -1; | 1659 | return -1; |
| 1637 | } | 1660 | } |
| 1638 | 1661 | ||
| @@ -1712,9 +1735,14 @@ static int aac_write(struct scsi_cmnd * scsicmd) | |||
| 1712 | * Allocate and initialize a Fib then setup a BlockWrite command | 1735 | * Allocate and initialize a Fib then setup a BlockWrite command |
| 1713 | */ | 1736 | */ |
| 1714 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { | 1737 | if (!(cmd_fibcontext = aac_fib_alloc(dev))) { |
| 1715 | scsicmd->result = DID_ERROR << 16; | 1738 | /* FIB temporarily unavailable,not catastrophic failure */ |
| 1716 | scsicmd->scsi_done(scsicmd); | 1739 | |
| 1717 | return 0; | 1740 | /* scsicmd->result = DID_ERROR << 16; |
| 1741 | * scsicmd->scsi_done(scsicmd); | ||
| 1742 | * return 0; | ||
| 1743 | */ | ||
| 1744 | printk(KERN_WARNING "aac_write: fib allocation failed\n"); | ||
| 1745 | return -1; | ||
| 1718 | } | 1746 | } |
| 1719 | 1747 | ||
| 1720 | status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua); | 1748 | status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua); |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 83986ed86556..619c02d9c862 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | *----------------------------------------------------------------------------*/ | 12 | *----------------------------------------------------------------------------*/ |
| 13 | 13 | ||
| 14 | #ifndef AAC_DRIVER_BUILD | 14 | #ifndef AAC_DRIVER_BUILD |
| 15 | # define AAC_DRIVER_BUILD 2461 | 15 | # define AAC_DRIVER_BUILD 24702 |
| 16 | # define AAC_DRIVER_BRANCH "-ms" | 16 | # define AAC_DRIVER_BRANCH "-ms" |
| 17 | #endif | 17 | #endif |
| 18 | #define MAXIMUM_NUM_CONTAINERS 32 | 18 | #define MAXIMUM_NUM_CONTAINERS 32 |
| @@ -1036,6 +1036,9 @@ struct aac_dev | |||
| 1036 | u8 printf_enabled; | 1036 | u8 printf_enabled; |
| 1037 | u8 in_reset; | 1037 | u8 in_reset; |
| 1038 | u8 msi; | 1038 | u8 msi; |
| 1039 | int management_fib_count; | ||
| 1040 | spinlock_t manage_lock; | ||
| 1041 | |||
| 1039 | }; | 1042 | }; |
| 1040 | 1043 | ||
| 1041 | #define aac_adapter_interrupt(dev) \ | 1044 | #define aac_adapter_interrupt(dev) \ |
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 0391d759dfdb..9c0c91178538 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c | |||
| @@ -153,7 +153,7 @@ cleanup: | |||
| 153 | fibptr->hw_fib_pa = hw_fib_pa; | 153 | fibptr->hw_fib_pa = hw_fib_pa; |
| 154 | fibptr->hw_fib_va = hw_fib; | 154 | fibptr->hw_fib_va = hw_fib; |
| 155 | } | 155 | } |
| 156 | if (retval != -EINTR) | 156 | if (retval != -ERESTARTSYS) |
| 157 | aac_fib_free(fibptr); | 157 | aac_fib_free(fibptr); |
| 158 | return retval; | 158 | return retval; |
| 159 | } | 159 | } |
| @@ -322,7 +322,7 @@ return_fib: | |||
| 322 | } | 322 | } |
| 323 | if (f.wait) { | 323 | if (f.wait) { |
| 324 | if(down_interruptible(&fibctx->wait_sem) < 0) { | 324 | if(down_interruptible(&fibctx->wait_sem) < 0) { |
| 325 | status = -EINTR; | 325 | status = -ERESTARTSYS; |
| 326 | } else { | 326 | } else { |
| 327 | /* Lock again and retry */ | 327 | /* Lock again and retry */ |
| 328 | spin_lock_irqsave(&dev->fib_lock, flags); | 328 | spin_lock_irqsave(&dev->fib_lock, flags); |
| @@ -593,10 +593,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 593 | u64 addr; | 593 | u64 addr; |
| 594 | void* p; | 594 | void* p; |
| 595 | if (upsg->sg[i].count > | 595 | if (upsg->sg[i].count > |
| 596 | (dev->adapter_info.options & | 596 | ((dev->adapter_info.options & |
| 597 | AAC_OPT_NEW_COMM) ? | 597 | AAC_OPT_NEW_COMM) ? |
| 598 | (dev->scsi_host_ptr->max_sectors << 9) : | 598 | (dev->scsi_host_ptr->max_sectors << 9) : |
| 599 | 65536) { | 599 | 65536)) { |
| 600 | rcode = -EINVAL; | 600 | rcode = -EINVAL; |
| 601 | goto cleanup; | 601 | goto cleanup; |
| 602 | } | 602 | } |
| @@ -645,10 +645,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 645 | u64 addr; | 645 | u64 addr; |
| 646 | void* p; | 646 | void* p; |
| 647 | if (usg->sg[i].count > | 647 | if (usg->sg[i].count > |
| 648 | (dev->adapter_info.options & | 648 | ((dev->adapter_info.options & |
| 649 | AAC_OPT_NEW_COMM) ? | 649 | AAC_OPT_NEW_COMM) ? |
| 650 | (dev->scsi_host_ptr->max_sectors << 9) : | 650 | (dev->scsi_host_ptr->max_sectors << 9) : |
| 651 | 65536) { | 651 | 65536)) { |
| 652 | rcode = -EINVAL; | 652 | rcode = -EINVAL; |
| 653 | goto cleanup; | 653 | goto cleanup; |
| 654 | } | 654 | } |
| @@ -695,10 +695,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 695 | uintptr_t addr; | 695 | uintptr_t addr; |
| 696 | void* p; | 696 | void* p; |
| 697 | if (usg->sg[i].count > | 697 | if (usg->sg[i].count > |
| 698 | (dev->adapter_info.options & | 698 | ((dev->adapter_info.options & |
| 699 | AAC_OPT_NEW_COMM) ? | 699 | AAC_OPT_NEW_COMM) ? |
| 700 | (dev->scsi_host_ptr->max_sectors << 9) : | 700 | (dev->scsi_host_ptr->max_sectors << 9) : |
| 701 | 65536) { | 701 | 65536)) { |
| 702 | rcode = -EINVAL; | 702 | rcode = -EINVAL; |
| 703 | goto cleanup; | 703 | goto cleanup; |
| 704 | } | 704 | } |
| @@ -734,10 +734,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 734 | dma_addr_t addr; | 734 | dma_addr_t addr; |
| 735 | void* p; | 735 | void* p; |
| 736 | if (upsg->sg[i].count > | 736 | if (upsg->sg[i].count > |
| 737 | (dev->adapter_info.options & | 737 | ((dev->adapter_info.options & |
| 738 | AAC_OPT_NEW_COMM) ? | 738 | AAC_OPT_NEW_COMM) ? |
| 739 | (dev->scsi_host_ptr->max_sectors << 9) : | 739 | (dev->scsi_host_ptr->max_sectors << 9) : |
| 740 | 65536) { | 740 | 65536)) { |
| 741 | rcode = -EINVAL; | 741 | rcode = -EINVAL; |
| 742 | goto cleanup; | 742 | goto cleanup; |
| 743 | } | 743 | } |
| @@ -772,8 +772,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | |||
| 772 | psg->count = cpu_to_le32(sg_indx+1); | 772 | psg->count = cpu_to_le32(sg_indx+1); |
| 773 | status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL); | 773 | status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL); |
| 774 | } | 774 | } |
| 775 | if (status == -EINTR) { | 775 | if (status == -ERESTARTSYS) { |
| 776 | rcode = -EINTR; | 776 | rcode = -ERESTARTSYS; |
| 777 | goto cleanup; | 777 | goto cleanup; |
| 778 | } | 778 | } |
| 779 | 779 | ||
| @@ -810,7 +810,7 @@ cleanup: | |||
| 810 | for(i=0; i <= sg_indx; i++){ | 810 | for(i=0; i <= sg_indx; i++){ |
| 811 | kfree(sg_list[i]); | 811 | kfree(sg_list[i]); |
| 812 | } | 812 | } |
| 813 | if (rcode != -EINTR) { | 813 | if (rcode != -ERESTARTSYS) { |
| 814 | aac_fib_complete(srbfib); | 814 | aac_fib_complete(srbfib); |
| 815 | aac_fib_free(srbfib); | 815 | aac_fib_free(srbfib); |
| 816 | } | 816 | } |
| @@ -848,7 +848,7 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg) | |||
| 848 | */ | 848 | */ |
| 849 | 849 | ||
| 850 | status = aac_dev_ioctl(dev, cmd, arg); | 850 | status = aac_dev_ioctl(dev, cmd, arg); |
| 851 | if(status != -ENOTTY) | 851 | if (status != -ENOTTY) |
| 852 | return status; | 852 | return status; |
| 853 | 853 | ||
| 854 | switch (cmd) { | 854 | switch (cmd) { |
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index 666d5151d628..a7261486ccd4 100644 --- a/drivers/scsi/aacraid/comminit.c +++ b/drivers/scsi/aacraid/comminit.c | |||
| @@ -194,7 +194,9 @@ int aac_send_shutdown(struct aac_dev * dev) | |||
| 194 | 194 | ||
| 195 | if (status >= 0) | 195 | if (status >= 0) |
| 196 | aac_fib_complete(fibctx); | 196 | aac_fib_complete(fibctx); |
| 197 | aac_fib_free(fibctx); | 197 | /* FIB should be freed only after getting the response from the F/W */ |
| 198 | if (status != -ERESTARTSYS) | ||
| 199 | aac_fib_free(fibctx); | ||
| 198 | return status; | 200 | return status; |
| 199 | } | 201 | } |
| 200 | 202 | ||
| @@ -304,6 +306,8 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) | |||
| 304 | /* | 306 | /* |
| 305 | * Check the preferred comm settings, defaults from template. | 307 | * Check the preferred comm settings, defaults from template. |
| 306 | */ | 308 | */ |
| 309 | dev->management_fib_count = 0; | ||
| 310 | spin_lock_init(&dev->manage_lock); | ||
| 307 | dev->max_fib_size = sizeof(struct hw_fib); | 311 | dev->max_fib_size = sizeof(struct hw_fib); |
| 308 | dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size | 312 | dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size |
| 309 | - sizeof(struct aac_fibhdr) | 313 | - sizeof(struct aac_fibhdr) |
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 956261f25181..94d2954d79ae 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
| @@ -189,7 +189,14 @@ struct fib *aac_fib_alloc(struct aac_dev *dev) | |||
| 189 | 189 | ||
| 190 | void aac_fib_free(struct fib *fibptr) | 190 | void aac_fib_free(struct fib *fibptr) |
| 191 | { | 191 | { |
| 192 | unsigned long flags; | 192 | unsigned long flags, flagsv; |
| 193 | |||
| 194 | spin_lock_irqsave(&fibptr->event_lock, flagsv); | ||
| 195 | if (fibptr->done == 2) { | ||
| 196 | spin_unlock_irqrestore(&fibptr->event_lock, flagsv); | ||
| 197 | return; | ||
| 198 | } | ||
| 199 | spin_unlock_irqrestore(&fibptr->event_lock, flagsv); | ||
| 193 | 200 | ||
| 194 | spin_lock_irqsave(&fibptr->dev->fib_lock, flags); | 201 | spin_lock_irqsave(&fibptr->dev->fib_lock, flags); |
| 195 | if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) | 202 | if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) |
| @@ -390,6 +397,8 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
| 390 | struct hw_fib * hw_fib = fibptr->hw_fib_va; | 397 | struct hw_fib * hw_fib = fibptr->hw_fib_va; |
| 391 | unsigned long flags = 0; | 398 | unsigned long flags = 0; |
| 392 | unsigned long qflags; | 399 | unsigned long qflags; |
| 400 | unsigned long mflags = 0; | ||
| 401 | |||
| 393 | 402 | ||
| 394 | if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) | 403 | if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) |
| 395 | return -EBUSY; | 404 | return -EBUSY; |
| @@ -471,9 +480,31 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
| 471 | if (!dev->queues) | 480 | if (!dev->queues) |
| 472 | return -EBUSY; | 481 | return -EBUSY; |
| 473 | 482 | ||
| 474 | if(wait) | 483 | if (wait) { |
| 484 | |||
| 485 | spin_lock_irqsave(&dev->manage_lock, mflags); | ||
| 486 | if (dev->management_fib_count >= AAC_NUM_MGT_FIB) { | ||
| 487 | printk(KERN_INFO "No management Fibs Available:%d\n", | ||
| 488 | dev->management_fib_count); | ||
| 489 | spin_unlock_irqrestore(&dev->manage_lock, mflags); | ||
| 490 | return -EBUSY; | ||
| 491 | } | ||
| 492 | dev->management_fib_count++; | ||
| 493 | spin_unlock_irqrestore(&dev->manage_lock, mflags); | ||
| 475 | spin_lock_irqsave(&fibptr->event_lock, flags); | 494 | spin_lock_irqsave(&fibptr->event_lock, flags); |
| 476 | aac_adapter_deliver(fibptr); | 495 | } |
| 496 | |||
| 497 | if (aac_adapter_deliver(fibptr) != 0) { | ||
| 498 | printk(KERN_ERR "aac_fib_send: returned -EBUSY\n"); | ||
| 499 | if (wait) { | ||
| 500 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | ||
| 501 | spin_lock_irqsave(&dev->manage_lock, mflags); | ||
| 502 | dev->management_fib_count--; | ||
| 503 | spin_unlock_irqrestore(&dev->manage_lock, mflags); | ||
| 504 | } | ||
| 505 | return -EBUSY; | ||
| 506 | } | ||
| 507 | |||
| 477 | 508 | ||
| 478 | /* | 509 | /* |
| 479 | * If the caller wanted us to wait for response wait now. | 510 | * If the caller wanted us to wait for response wait now. |
| @@ -516,14 +547,15 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
| 516 | udelay(5); | 547 | udelay(5); |
| 517 | } | 548 | } |
| 518 | } else if (down_interruptible(&fibptr->event_wait)) { | 549 | } else if (down_interruptible(&fibptr->event_wait)) { |
| 519 | fibptr->done = 2; | 550 | /* Do nothing ... satisfy |
| 520 | up(&fibptr->event_wait); | 551 | * down_interruptible must_check */ |
| 521 | } | 552 | } |
| 553 | |||
| 522 | spin_lock_irqsave(&fibptr->event_lock, flags); | 554 | spin_lock_irqsave(&fibptr->event_lock, flags); |
| 523 | if ((fibptr->done == 0) || (fibptr->done == 2)) { | 555 | if (fibptr->done == 0) { |
| 524 | fibptr->done = 2; /* Tell interrupt we aborted */ | 556 | fibptr->done = 2; /* Tell interrupt we aborted */ |
| 525 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | 557 | spin_unlock_irqrestore(&fibptr->event_lock, flags); |
| 526 | return -EINTR; | 558 | return -ERESTARTSYS; |
| 527 | } | 559 | } |
| 528 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | 560 | spin_unlock_irqrestore(&fibptr->event_lock, flags); |
| 529 | BUG_ON(fibptr->done == 0); | 561 | BUG_ON(fibptr->done == 0); |
| @@ -689,6 +721,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
| 689 | 721 | ||
| 690 | int aac_fib_complete(struct fib *fibptr) | 722 | int aac_fib_complete(struct fib *fibptr) |
| 691 | { | 723 | { |
| 724 | unsigned long flags; | ||
| 692 | struct hw_fib * hw_fib = fibptr->hw_fib_va; | 725 | struct hw_fib * hw_fib = fibptr->hw_fib_va; |
| 693 | 726 | ||
| 694 | /* | 727 | /* |
| @@ -709,6 +742,13 @@ int aac_fib_complete(struct fib *fibptr) | |||
| 709 | * command is complete that we had sent to the adapter and this | 742 | * command is complete that we had sent to the adapter and this |
| 710 | * cdb could be reused. | 743 | * cdb could be reused. |
| 711 | */ | 744 | */ |
| 745 | spin_lock_irqsave(&fibptr->event_lock, flags); | ||
| 746 | if (fibptr->done == 2) { | ||
| 747 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | ||
| 748 | return 0; | ||
| 749 | } | ||
| 750 | spin_unlock_irqrestore(&fibptr->event_lock, flags); | ||
| 751 | |||
| 712 | if((hw_fib->header.XferState & cpu_to_le32(SentFromHost)) && | 752 | if((hw_fib->header.XferState & cpu_to_le32(SentFromHost)) && |
| 713 | (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed))) | 753 | (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed))) |
| 714 | { | 754 | { |
| @@ -1355,7 +1395,10 @@ int aac_reset_adapter(struct aac_dev * aac, int forced) | |||
| 1355 | 1395 | ||
| 1356 | if (status >= 0) | 1396 | if (status >= 0) |
| 1357 | aac_fib_complete(fibctx); | 1397 | aac_fib_complete(fibctx); |
| 1358 | aac_fib_free(fibctx); | 1398 | /* FIB should be freed only after getting |
| 1399 | * the response from the F/W */ | ||
| 1400 | if (status != -ERESTARTSYS) | ||
| 1401 | aac_fib_free(fibctx); | ||
| 1359 | } | 1402 | } |
| 1360 | } | 1403 | } |
| 1361 | 1404 | ||
| @@ -1759,6 +1802,7 @@ int aac_command_thread(void *data) | |||
| 1759 | struct fib *fibptr; | 1802 | struct fib *fibptr; |
| 1760 | 1803 | ||
| 1761 | if ((fibptr = aac_fib_alloc(dev))) { | 1804 | if ((fibptr = aac_fib_alloc(dev))) { |
| 1805 | int status; | ||
| 1762 | __le32 *info; | 1806 | __le32 *info; |
| 1763 | 1807 | ||
| 1764 | aac_fib_init(fibptr); | 1808 | aac_fib_init(fibptr); |
| @@ -1769,15 +1813,21 @@ int aac_command_thread(void *data) | |||
| 1769 | 1813 | ||
| 1770 | *info = cpu_to_le32(now.tv_sec); | 1814 | *info = cpu_to_le32(now.tv_sec); |
| 1771 | 1815 | ||
| 1772 | (void)aac_fib_send(SendHostTime, | 1816 | status = aac_fib_send(SendHostTime, |
| 1773 | fibptr, | 1817 | fibptr, |
| 1774 | sizeof(*info), | 1818 | sizeof(*info), |
| 1775 | FsaNormal, | 1819 | FsaNormal, |
| 1776 | 1, 1, | 1820 | 1, 1, |
| 1777 | NULL, | 1821 | NULL, |
| 1778 | NULL); | 1822 | NULL); |
| 1779 | aac_fib_complete(fibptr); | 1823 | /* Do not set XferState to zero unless |
| 1780 | aac_fib_free(fibptr); | 1824 | * receives a response from F/W */ |
| 1825 | if (status >= 0) | ||
| 1826 | aac_fib_complete(fibptr); | ||
| 1827 | /* FIB should be freed only after | ||
| 1828 | * getting the response from the F/W */ | ||
| 1829 | if (status != -ERESTARTSYS) | ||
| 1830 | aac_fib_free(fibptr); | ||
| 1781 | } | 1831 | } |
| 1782 | difference = (long)(unsigned)update_interval*HZ; | 1832 | difference = (long)(unsigned)update_interval*HZ; |
| 1783 | } else { | 1833 | } else { |
diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index abc9ef5d1b10..9c7408fe8c7d 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c | |||
| @@ -57,9 +57,9 @@ unsigned int aac_response_normal(struct aac_queue * q) | |||
| 57 | struct hw_fib * hwfib; | 57 | struct hw_fib * hwfib; |
| 58 | struct fib * fib; | 58 | struct fib * fib; |
| 59 | int consumed = 0; | 59 | int consumed = 0; |
| 60 | unsigned long flags; | 60 | unsigned long flags, mflags; |
| 61 | 61 | ||
| 62 | spin_lock_irqsave(q->lock, flags); | 62 | spin_lock_irqsave(q->lock, flags); |
| 63 | /* | 63 | /* |
| 64 | * Keep pulling response QEs off the response queue and waking | 64 | * Keep pulling response QEs off the response queue and waking |
| 65 | * up the waiters until there are no more QEs. We then return | 65 | * up the waiters until there are no more QEs. We then return |
| @@ -125,12 +125,21 @@ unsigned int aac_response_normal(struct aac_queue * q) | |||
| 125 | } else { | 125 | } else { |
| 126 | unsigned long flagv; | 126 | unsigned long flagv; |
| 127 | spin_lock_irqsave(&fib->event_lock, flagv); | 127 | spin_lock_irqsave(&fib->event_lock, flagv); |
| 128 | if (!fib->done) | 128 | if (!fib->done) { |
| 129 | fib->done = 1; | 129 | fib->done = 1; |
| 130 | up(&fib->event_wait); | 130 | up(&fib->event_wait); |
| 131 | } | ||
| 131 | spin_unlock_irqrestore(&fib->event_lock, flagv); | 132 | spin_unlock_irqrestore(&fib->event_lock, flagv); |
| 133 | |||
| 134 | spin_lock_irqsave(&dev->manage_lock, mflags); | ||
| 135 | dev->management_fib_count--; | ||
| 136 | spin_unlock_irqrestore(&dev->manage_lock, mflags); | ||
| 137 | |||
| 132 | FIB_COUNTER_INCREMENT(aac_config.NormalRecved); | 138 | FIB_COUNTER_INCREMENT(aac_config.NormalRecved); |
| 133 | if (fib->done == 2) { | 139 | if (fib->done == 2) { |
| 140 | spin_lock_irqsave(&fib->event_lock, flagv); | ||
| 141 | fib->done = 0; | ||
| 142 | spin_unlock_irqrestore(&fib->event_lock, flagv); | ||
| 134 | aac_fib_complete(fib); | 143 | aac_fib_complete(fib); |
| 135 | aac_fib_free(fib); | 144 | aac_fib_free(fib); |
| 136 | } | 145 | } |
| @@ -232,6 +241,7 @@ unsigned int aac_command_normal(struct aac_queue *q) | |||
| 232 | 241 | ||
| 233 | unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | 242 | unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) |
| 234 | { | 243 | { |
| 244 | unsigned long mflags; | ||
| 235 | dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index)); | 245 | dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index)); |
| 236 | if ((index & 0x00000002L)) { | 246 | if ((index & 0x00000002L)) { |
| 237 | struct hw_fib * hw_fib; | 247 | struct hw_fib * hw_fib; |
| @@ -320,11 +330,25 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | |||
| 320 | unsigned long flagv; | 330 | unsigned long flagv; |
| 321 | dprintk((KERN_INFO "event_wait up\n")); | 331 | dprintk((KERN_INFO "event_wait up\n")); |
| 322 | spin_lock_irqsave(&fib->event_lock, flagv); | 332 | spin_lock_irqsave(&fib->event_lock, flagv); |
| 323 | if (!fib->done) | 333 | if (!fib->done) { |
| 324 | fib->done = 1; | 334 | fib->done = 1; |
| 325 | up(&fib->event_wait); | 335 | up(&fib->event_wait); |
| 336 | } | ||
| 326 | spin_unlock_irqrestore(&fib->event_lock, flagv); | 337 | spin_unlock_irqrestore(&fib->event_lock, flagv); |
| 338 | |||
| 339 | spin_lock_irqsave(&dev->manage_lock, mflags); | ||
| 340 | dev->management_fib_count--; | ||
| 341 | spin_unlock_irqrestore(&dev->manage_lock, mflags); | ||
| 342 | |||
| 327 | FIB_COUNTER_INCREMENT(aac_config.NormalRecved); | 343 | FIB_COUNTER_INCREMENT(aac_config.NormalRecved); |
| 344 | if (fib->done == 2) { | ||
| 345 | spin_lock_irqsave(&fib->event_lock, flagv); | ||
| 346 | fib->done = 0; | ||
| 347 | spin_unlock_irqrestore(&fib->event_lock, flagv); | ||
| 348 | aac_fib_complete(fib); | ||
| 349 | aac_fib_free(fib); | ||
| 350 | } | ||
| 351 | |||
| 328 | } | 352 | } |
| 329 | return 0; | 353 | return 0; |
| 330 | } | 354 | } |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 4d419c155ce9..78971db5b60e 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
| @@ -3171,13 +3171,16 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
| 3171 | tinfo->curr.transport_version = 2; | 3171 | tinfo->curr.transport_version = 2; |
| 3172 | tinfo->goal.transport_version = 2; | 3172 | tinfo->goal.transport_version = 2; |
| 3173 | tinfo->goal.ppr_options = 0; | 3173 | tinfo->goal.ppr_options = 0; |
| 3174 | /* | 3174 | if (scb != NULL) { |
| 3175 | * Remove any SCBs in the waiting for selection | 3175 | /* |
| 3176 | * queue that may also be for this target so | 3176 | * Remove any SCBs in the waiting |
| 3177 | * that command ordering is preserved. | 3177 | * for selection queue that may |
| 3178 | */ | 3178 | * also be for this target so that |
| 3179 | ahd_freeze_devq(ahd, scb); | 3179 | * command ordering is preserved. |
| 3180 | ahd_qinfifo_requeue_tail(ahd, scb); | 3180 | */ |
| 3181 | ahd_freeze_devq(ahd, scb); | ||
| 3182 | ahd_qinfifo_requeue_tail(ahd, scb); | ||
| 3183 | } | ||
| 3181 | printerror = 0; | 3184 | printerror = 0; |
| 3182 | } | 3185 | } |
| 3183 | } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE) | 3186 | } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE) |
| @@ -3194,13 +3197,16 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
| 3194 | MSG_EXT_WDTR_BUS_8_BIT, | 3197 | MSG_EXT_WDTR_BUS_8_BIT, |
| 3195 | AHD_TRANS_CUR|AHD_TRANS_GOAL, | 3198 | AHD_TRANS_CUR|AHD_TRANS_GOAL, |
| 3196 | /*paused*/TRUE); | 3199 | /*paused*/TRUE); |
| 3197 | /* | 3200 | if (scb != NULL) { |
| 3198 | * Remove any SCBs in the waiting for selection | 3201 | /* |
| 3199 | * queue that may also be for this target so that | 3202 | * Remove any SCBs in the waiting for |
| 3200 | * command ordering is preserved. | 3203 | * selection queue that may also be for |
| 3201 | */ | 3204 | * this target so that command ordering |
| 3202 | ahd_freeze_devq(ahd, scb); | 3205 | * is preserved. |
| 3203 | ahd_qinfifo_requeue_tail(ahd, scb); | 3206 | */ |
| 3207 | ahd_freeze_devq(ahd, scb); | ||
| 3208 | ahd_qinfifo_requeue_tail(ahd, scb); | ||
| 3209 | } | ||
| 3204 | printerror = 0; | 3210 | printerror = 0; |
| 3205 | } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE) | 3211 | } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE) |
| 3206 | && ppr_busfree == 0) { | 3212 | && ppr_busfree == 0) { |
| @@ -3217,13 +3223,16 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
| 3217 | /*ppr_options*/0, | 3223 | /*ppr_options*/0, |
| 3218 | AHD_TRANS_CUR|AHD_TRANS_GOAL, | 3224 | AHD_TRANS_CUR|AHD_TRANS_GOAL, |
| 3219 | /*paused*/TRUE); | 3225 | /*paused*/TRUE); |
| 3220 | /* | 3226 | if (scb != NULL) { |
| 3221 | * Remove any SCBs in the waiting for selection | 3227 | /* |
| 3222 | * queue that may also be for this target so that | 3228 | * Remove any SCBs in the waiting for |
| 3223 | * command ordering is preserved. | 3229 | * selection queue that may also be for |
| 3224 | */ | 3230 | * this target so that command ordering |
| 3225 | ahd_freeze_devq(ahd, scb); | 3231 | * is preserved. |
| 3226 | ahd_qinfifo_requeue_tail(ahd, scb); | 3232 | */ |
| 3233 | ahd_freeze_devq(ahd, scb); | ||
| 3234 | ahd_qinfifo_requeue_tail(ahd, scb); | ||
| 3235 | } | ||
| 3227 | printerror = 0; | 3236 | printerror = 0; |
| 3228 | } else if ((ahd->msg_flags & MSG_FLAG_EXPECT_IDE_BUSFREE) != 0 | 3237 | } else if ((ahd->msg_flags & MSG_FLAG_EXPECT_IDE_BUSFREE) != 0 |
| 3229 | && ahd_sent_msg(ahd, AHDMSG_1B, | 3238 | && ahd_sent_msg(ahd, AHDMSG_1B, |
| @@ -3251,7 +3260,7 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
| 3251 | * the message phases. We check it last in case we | 3260 | * the message phases. We check it last in case we |
| 3252 | * had to send some other message that caused a busfree. | 3261 | * had to send some other message that caused a busfree. |
| 3253 | */ | 3262 | */ |
| 3254 | if (printerror != 0 | 3263 | if (scb != NULL && printerror != 0 |
| 3255 | && (lastphase == P_MESGIN || lastphase == P_MESGOUT) | 3264 | && (lastphase == P_MESGIN || lastphase == P_MESGOUT) |
| 3256 | && ((ahd->msg_flags & MSG_FLAG_EXPECT_PPR_BUSFREE) != 0)) { | 3265 | && ((ahd->msg_flags & MSG_FLAG_EXPECT_PPR_BUSFREE) != 0)) { |
| 3257 | 3266 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 2445e399fd60..2445e399fd60 100755..100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index 8a2a1c5935c6..8a2a1c5935c6 100755..100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 608e675f68c8..1263d9796e89 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
| @@ -1586,8 +1586,7 @@ typedef struct fc_port { | |||
| 1586 | */ | 1586 | */ |
| 1587 | #define FCF_FABRIC_DEVICE BIT_0 | 1587 | #define FCF_FABRIC_DEVICE BIT_0 |
| 1588 | #define FCF_LOGIN_NEEDED BIT_1 | 1588 | #define FCF_LOGIN_NEEDED BIT_1 |
| 1589 | #define FCF_TAPE_PRESENT BIT_2 | 1589 | #define FCF_FCP2_DEVICE BIT_2 |
| 1590 | #define FCF_FCP2_DEVICE BIT_3 | ||
| 1591 | 1590 | ||
| 1592 | /* No loop ID flag. */ | 1591 | /* No loop ID flag. */ |
| 1593 | #define FC_NO_LOOP_ID 0x1000 | 1592 | #define FC_NO_LOOP_ID 0x1000 |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index b4a0eac8f96d..3f8e8495b743 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
| @@ -205,7 +205,7 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
| 205 | 205 | ||
| 206 | switch (data[0]) { | 206 | switch (data[0]) { |
| 207 | case MBS_COMMAND_COMPLETE: | 207 | case MBS_COMMAND_COMPLETE: |
| 208 | if (fcport->flags & FCF_TAPE_PRESENT) | 208 | if (fcport->flags & FCF_FCP2_DEVICE) |
| 209 | opts |= BIT_1; | 209 | opts |= BIT_1; |
| 210 | rval = qla2x00_get_port_database(vha, fcport, opts); | 210 | rval = qla2x00_get_port_database(vha, fcport, opts); |
| 211 | if (rval != QLA_SUCCESS) | 211 | if (rval != QLA_SUCCESS) |
| @@ -2726,7 +2726,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
| 2726 | 2726 | ||
| 2727 | /* | 2727 | /* |
| 2728 | * Logout all previous fabric devices marked lost, except | 2728 | * Logout all previous fabric devices marked lost, except |
| 2729 | * tape devices. | 2729 | * FCP2 devices. |
| 2730 | */ | 2730 | */ |
| 2731 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | 2731 | list_for_each_entry(fcport, &vha->vp_fcports, list) { |
| 2732 | if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) | 2732 | if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) |
| @@ -2739,7 +2739,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) | |||
| 2739 | qla2x00_mark_device_lost(vha, fcport, | 2739 | qla2x00_mark_device_lost(vha, fcport, |
| 2740 | ql2xplogiabsentdevice, 0); | 2740 | ql2xplogiabsentdevice, 0); |
| 2741 | if (fcport->loop_id != FC_NO_LOOP_ID && | 2741 | if (fcport->loop_id != FC_NO_LOOP_ID && |
| 2742 | (fcport->flags & FCF_TAPE_PRESENT) == 0 && | 2742 | (fcport->flags & FCF_FCP2_DEVICE) == 0 && |
| 2743 | fcport->port_type != FCT_INITIATOR && | 2743 | fcport->port_type != FCT_INITIATOR && |
| 2744 | fcport->port_type != FCT_BROADCAST) { | 2744 | fcport->port_type != FCT_BROADCAST) { |
| 2745 | ha->isp_ops->fabric_logout(vha, | 2745 | ha->isp_ops->fabric_logout(vha, |
| @@ -3018,7 +3018,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, | |||
| 3018 | fcport->d_id.b24 = new_fcport->d_id.b24; | 3018 | fcport->d_id.b24 = new_fcport->d_id.b24; |
| 3019 | fcport->flags |= FCF_LOGIN_NEEDED; | 3019 | fcport->flags |= FCF_LOGIN_NEEDED; |
| 3020 | if (fcport->loop_id != FC_NO_LOOP_ID && | 3020 | if (fcport->loop_id != FC_NO_LOOP_ID && |
| 3021 | (fcport->flags & FCF_TAPE_PRESENT) == 0 && | 3021 | (fcport->flags & FCF_FCP2_DEVICE) == 0 && |
| 3022 | fcport->port_type != FCT_INITIATOR && | 3022 | fcport->port_type != FCT_INITIATOR && |
| 3023 | fcport->port_type != FCT_BROADCAST) { | 3023 | fcport->port_type != FCT_BROADCAST) { |
| 3024 | ha->isp_ops->fabric_logout(vha, fcport->loop_id, | 3024 | ha->isp_ops->fabric_logout(vha, fcport->loop_id, |
| @@ -3272,9 +3272,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport, | |||
| 3272 | 3272 | ||
| 3273 | rval = qla2x00_fabric_login(vha, fcport, next_loopid); | 3273 | rval = qla2x00_fabric_login(vha, fcport, next_loopid); |
| 3274 | if (rval == QLA_SUCCESS) { | 3274 | if (rval == QLA_SUCCESS) { |
| 3275 | /* Send an ADISC to tape devices.*/ | 3275 | /* Send an ADISC to FCP2 devices.*/ |
| 3276 | opts = 0; | 3276 | opts = 0; |
| 3277 | if (fcport->flags & FCF_TAPE_PRESENT) | 3277 | if (fcport->flags & FCF_FCP2_DEVICE) |
| 3278 | opts |= BIT_1; | 3278 | opts |= BIT_1; |
| 3279 | rval = qla2x00_get_port_database(vha, fcport, opts); | 3279 | rval = qla2x00_get_port_database(vha, fcport, opts); |
| 3280 | if (rval != QLA_SUCCESS) { | 3280 | if (rval != QLA_SUCCESS) { |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 209f50e788a1..8529eb1f3cd4 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -1188,7 +1188,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev) | |||
| 1188 | scsi_qla_host_t *vha = shost_priv(sdev->host); | 1188 | scsi_qla_host_t *vha = shost_priv(sdev->host); |
| 1189 | struct qla_hw_data *ha = vha->hw; | 1189 | struct qla_hw_data *ha = vha->hw; |
| 1190 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); | 1190 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); |
| 1191 | fc_port_t *fcport = *(fc_port_t **)rport->dd_data; | ||
| 1192 | struct req_que *req = vha->req; | 1191 | struct req_que *req = vha->req; |
| 1193 | 1192 | ||
| 1194 | if (sdev->tagged_supported) | 1193 | if (sdev->tagged_supported) |
| @@ -1197,8 +1196,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev) | |||
| 1197 | scsi_deactivate_tcq(sdev, req->max_q_depth); | 1196 | scsi_deactivate_tcq(sdev, req->max_q_depth); |
| 1198 | 1197 | ||
| 1199 | rport->dev_loss_tmo = ha->port_down_retry_count; | 1198 | rport->dev_loss_tmo = ha->port_down_retry_count; |
| 1200 | if (sdev->type == TYPE_TAPE) | ||
| 1201 | fcport->flags |= FCF_TAPE_PRESENT; | ||
| 1202 | 1199 | ||
| 1203 | return 0; | 1200 | return 0; |
| 1204 | } | 1201 | } |
| @@ -2805,7 +2802,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha) | |||
| 2805 | 2802 | ||
| 2806 | fcport->login_retry--; | 2803 | fcport->login_retry--; |
| 2807 | if (fcport->flags & FCF_FABRIC_DEVICE) { | 2804 | if (fcport->flags & FCF_FABRIC_DEVICE) { |
| 2808 | if (fcport->flags & FCF_TAPE_PRESENT) | 2805 | if (fcport->flags & FCF_FCP2_DEVICE) |
| 2809 | ha->isp_ops->fabric_logout(vha, | 2806 | ha->isp_ops->fabric_logout(vha, |
| 2810 | fcport->loop_id, | 2807 | fcport->loop_id, |
| 2811 | fcport->d_id.b.domain, | 2808 | fcport->d_id.b.domain, |
| @@ -3141,7 +3138,10 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
| 3141 | if (!IS_QLA2100(ha) && vha->link_down_timeout) | 3138 | if (!IS_QLA2100(ha) && vha->link_down_timeout) |
| 3142 | atomic_set(&vha->loop_state, LOOP_DEAD); | 3139 | atomic_set(&vha->loop_state, LOOP_DEAD); |
| 3143 | 3140 | ||
| 3144 | /* Schedule an ISP abort to return any tape commands. */ | 3141 | /* |
| 3142 | * Schedule an ISP abort to return any FCP2-device | ||
| 3143 | * commands. | ||
| 3144 | */ | ||
| 3145 | /* NPIV - scan physical port only */ | 3145 | /* NPIV - scan physical port only */ |
| 3146 | if (!vha->vp_idx) { | 3146 | if (!vha->vp_idx) { |
| 3147 | spin_lock_irqsave(&ha->hardware_lock, | 3147 | spin_lock_irqsave(&ha->hardware_lock, |
| @@ -3158,7 +3158,7 @@ qla2x00_timer(scsi_qla_host_t *vha) | |||
| 3158 | if (sp->ctx) | 3158 | if (sp->ctx) |
| 3159 | continue; | 3159 | continue; |
| 3160 | sfcp = sp->fcport; | 3160 | sfcp = sp->fcport; |
| 3161 | if (!(sfcp->flags & FCF_TAPE_PRESENT)) | 3161 | if (!(sfcp->flags & FCF_FCP2_DEVICE)) |
| 3162 | continue; | 3162 | continue; |
| 3163 | 3163 | ||
| 3164 | set_bit(ISP_ABORT_NEEDED, | 3164 | set_bit(ISP_ABORT_NEEDED, |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index 010e69b29afe..371dc895972a 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
| @@ -2292,11 +2292,14 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, | |||
| 2292 | uint32_t faddr, left, burst; | 2292 | uint32_t faddr, left, burst; |
| 2293 | struct qla_hw_data *ha = vha->hw; | 2293 | struct qla_hw_data *ha = vha->hw; |
| 2294 | 2294 | ||
| 2295 | if (IS_QLA25XX(ha) || IS_QLA81XX(ha)) | ||
| 2296 | goto try_fast; | ||
| 2295 | if (offset & 0xfff) | 2297 | if (offset & 0xfff) |
| 2296 | goto slow_read; | 2298 | goto slow_read; |
| 2297 | if (length < OPTROM_BURST_SIZE) | 2299 | if (length < OPTROM_BURST_SIZE) |
| 2298 | goto slow_read; | 2300 | goto slow_read; |
| 2299 | 2301 | ||
| 2302 | try_fast: | ||
| 2300 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, | 2303 | optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, |
| 2301 | &optrom_dma, GFP_KERNEL); | 2304 | &optrom_dma, GFP_KERNEL); |
| 2302 | if (!optrom) { | 2305 | if (!optrom) { |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index a65dd95507c6..ed36279a33c1 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.01-k9" | 10 | #define QLA2XXX_VERSION "8.03.01-k10" |
| 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/scsi_lib.c b/drivers/scsi/scsi_lib.c index d8927681ec88..c6642423cc67 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -749,9 +749,9 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 749 | */ | 749 | */ |
| 750 | req->next_rq->resid_len = scsi_in(cmd)->resid; | 750 | req->next_rq->resid_len = scsi_in(cmd)->resid; |
| 751 | 751 | ||
| 752 | scsi_release_buffers(cmd); | ||
| 752 | blk_end_request_all(req, 0); | 753 | blk_end_request_all(req, 0); |
| 753 | 754 | ||
| 754 | scsi_release_buffers(cmd); | ||
| 755 | scsi_next_command(cmd); | 755 | scsi_next_command(cmd); |
| 756 | return; | 756 | return; |
| 757 | } | 757 | } |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index ddfcecd5099f..653f22a8deb9 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
| @@ -3527,7 +3527,10 @@ fc_bsg_job_timeout(struct request *req) | |||
| 3527 | if (!done && i->f->bsg_timeout) { | 3527 | if (!done && i->f->bsg_timeout) { |
| 3528 | /* call LLDD to abort the i/o as it has timed out */ | 3528 | /* call LLDD to abort the i/o as it has timed out */ |
| 3529 | err = i->f->bsg_timeout(job); | 3529 | err = i->f->bsg_timeout(job); |
| 3530 | if (err) | 3530 | if (err == -EAGAIN) { |
| 3531 | job->ref_cnt--; | ||
| 3532 | return BLK_EH_RESET_TIMER; | ||
| 3533 | } else if (err) | ||
| 3531 | printk(KERN_ERR "ERROR: FC BSG request timeout - LLD " | 3534 | printk(KERN_ERR "ERROR: FC BSG request timeout - LLD " |
| 3532 | "abort failed with status %d\n", err); | 3535 | "abort failed with status %d\n", err); |
| 3533 | } | 3536 | } |
