diff options
Diffstat (limited to 'drivers/block/rsxx/dev.c')
-rw-r--r-- | drivers/block/rsxx/dev.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/block/rsxx/dev.c b/drivers/block/rsxx/dev.c index 4346d17d2949..d7af441880be 100644 --- a/drivers/block/rsxx/dev.c +++ b/drivers/block/rsxx/dev.c | |||
@@ -155,7 +155,8 @@ static void bio_dma_done_cb(struct rsxx_cardinfo *card, | |||
155 | atomic_set(&meta->error, 1); | 155 | atomic_set(&meta->error, 1); |
156 | 156 | ||
157 | if (atomic_dec_and_test(&meta->pending_dmas)) { | 157 | if (atomic_dec_and_test(&meta->pending_dmas)) { |
158 | disk_stats_complete(card, meta->bio, meta->start_time); | 158 | if (!card->eeh_state && card->gendisk) |
159 | disk_stats_complete(card, meta->bio, meta->start_time); | ||
159 | 160 | ||
160 | bio_endio(meta->bio, atomic_read(&meta->error) ? -EIO : 0); | 161 | bio_endio(meta->bio, atomic_read(&meta->error) ? -EIO : 0); |
161 | kmem_cache_free(bio_meta_pool, meta); | 162 | kmem_cache_free(bio_meta_pool, meta); |
@@ -170,6 +171,12 @@ static void rsxx_make_request(struct request_queue *q, struct bio *bio) | |||
170 | 171 | ||
171 | might_sleep(); | 172 | might_sleep(); |
172 | 173 | ||
174 | if (!card) | ||
175 | goto req_err; | ||
176 | |||
177 | if (bio->bi_sector + (bio->bi_size >> 9) > get_capacity(card->gendisk)) | ||
178 | goto req_err; | ||
179 | |||
173 | if (unlikely(card->halt)) { | 180 | if (unlikely(card->halt)) { |
174 | st = -EFAULT; | 181 | st = -EFAULT; |
175 | goto req_err; | 182 | goto req_err; |
@@ -196,7 +203,8 @@ static void rsxx_make_request(struct request_queue *q, struct bio *bio) | |||
196 | atomic_set(&bio_meta->pending_dmas, 0); | 203 | atomic_set(&bio_meta->pending_dmas, 0); |
197 | bio_meta->start_time = jiffies; | 204 | bio_meta->start_time = jiffies; |
198 | 205 | ||
199 | disk_stats_start(card, bio); | 206 | if (!unlikely(card->halt)) |
207 | disk_stats_start(card, bio); | ||
200 | 208 | ||
201 | dev_dbg(CARD_TO_DEV(card), "BIO[%c]: meta: %p addr8: x%llx size: %d\n", | 209 | dev_dbg(CARD_TO_DEV(card), "BIO[%c]: meta: %p addr8: x%llx size: %d\n", |
202 | bio_data_dir(bio) ? 'W' : 'R', bio_meta, | 210 | bio_data_dir(bio) ? 'W' : 'R', bio_meta, |
@@ -225,24 +233,6 @@ static bool rsxx_discard_supported(struct rsxx_cardinfo *card) | |||
225 | return (pci_rev >= RSXX_DISCARD_SUPPORT); | 233 | return (pci_rev >= RSXX_DISCARD_SUPPORT); |
226 | } | 234 | } |
227 | 235 | ||
228 | static unsigned short rsxx_get_logical_block_size( | ||
229 | struct rsxx_cardinfo *card) | ||
230 | { | ||
231 | u32 capabilities = 0; | ||
232 | int st; | ||
233 | |||
234 | st = rsxx_get_card_capabilities(card, &capabilities); | ||
235 | if (st) | ||
236 | dev_warn(CARD_TO_DEV(card), | ||
237 | "Failed reading card capabilities register\n"); | ||
238 | |||
239 | /* Earlier firmware did not have support for 512 byte accesses */ | ||
240 | if (capabilities & CARD_CAP_SUBPAGE_WRITES) | ||
241 | return 512; | ||
242 | else | ||
243 | return RSXX_HW_BLK_SIZE; | ||
244 | } | ||
245 | |||
246 | int rsxx_attach_dev(struct rsxx_cardinfo *card) | 236 | int rsxx_attach_dev(struct rsxx_cardinfo *card) |
247 | { | 237 | { |
248 | mutex_lock(&card->dev_lock); | 238 | mutex_lock(&card->dev_lock); |
@@ -305,7 +295,7 @@ int rsxx_setup_dev(struct rsxx_cardinfo *card) | |||
305 | return -ENOMEM; | 295 | return -ENOMEM; |
306 | } | 296 | } |
307 | 297 | ||
308 | blk_size = rsxx_get_logical_block_size(card); | 298 | blk_size = card->config.data.block_size; |
309 | 299 | ||
310 | blk_queue_make_request(card->queue, rsxx_make_request); | 300 | blk_queue_make_request(card->queue, rsxx_make_request); |
311 | blk_queue_bounce_limit(card->queue, BLK_BOUNCE_ANY); | 301 | blk_queue_bounce_limit(card->queue, BLK_BOUNCE_ANY); |
@@ -347,6 +337,7 @@ void rsxx_destroy_dev(struct rsxx_cardinfo *card) | |||
347 | card->gendisk = NULL; | 337 | card->gendisk = NULL; |
348 | 338 | ||
349 | blk_cleanup_queue(card->queue); | 339 | blk_cleanup_queue(card->queue); |
340 | card->queue->queuedata = NULL; | ||
350 | unregister_blkdev(card->major, DRIVER_NAME); | 341 | unregister_blkdev(card->major, DRIVER_NAME); |
351 | } | 342 | } |
352 | 343 | ||