diff options
| author | Jens Axboe <axboe@kernel.dk> | 2011-09-27 23:27:43 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2011-11-05 03:35:10 -0400 |
| commit | 6316668fbcf8a0a166830e7e84cdbdf0ab9392c8 (patch) | |
| tree | 7d18003afb0e1be5c9029c277c7fccb1202e5d30 | |
| parent | ef0f1587343a4c17b9b0d9061546e36c1c1bb2ec (diff) | |
mtip32xx: ensure that all local functions are static
Kill the declarations in the header file and mark them as static.
Reshuffle a few functions to ensure that everything is properly
declared before being used.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
| -rw-r--r-- | drivers/block/mtip32xx/mtip32xx.c | 632 | ||||
| -rw-r--r-- | drivers/block/mtip32xx/mtip32xx.h | 33 |
2 files changed, 313 insertions, 352 deletions
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index d58581b83c8d..40d840e56256 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -108,6 +108,72 @@ static int mtip_exec_internal_command(struct mtip_port *port, | |||
| 108 | unsigned long timeout); | 108 | unsigned long timeout); |
| 109 | 109 | ||
| 110 | /* | 110 | /* |
| 111 | * This function check_for_surprise_removal is called | ||
| 112 | * while card is removed from the system and it will | ||
| 113 | * read the vendor id from the configration space | ||
| 114 | * | ||
| 115 | * @pdev Pointer to the pci_dev structure. | ||
| 116 | * | ||
| 117 | * return value | ||
| 118 | * true if device removed, else false | ||
| 119 | */ | ||
| 120 | static bool mtip_check_surprise_removal(struct pci_dev *pdev) | ||
| 121 | { | ||
| 122 | u16 vendor_id = 0; | ||
| 123 | |||
| 124 | /* Read the vendorID from the configuration space */ | ||
| 125 | pci_read_config_word(pdev, 0x00, &vendor_id); | ||
| 126 | if (vendor_id == 0xFFFF) | ||
| 127 | return true; /* device removed */ | ||
| 128 | |||
| 129 | return false; /* device present */ | ||
| 130 | } | ||
| 131 | |||
| 132 | /* | ||
| 133 | * This function is called for clean the pending command in the | ||
| 134 | * command slot during the surprise removal of device and return | ||
| 135 | * error to the upper layer. | ||
| 136 | * | ||
| 137 | * @dd Pointer to the DRIVER_DATA structure. | ||
| 138 | * | ||
| 139 | * return value | ||
| 140 | * None | ||
| 141 | */ | ||
| 142 | static void mtip_command_cleanup(struct driver_data *dd) | ||
| 143 | { | ||
| 144 | int group = 0, commandslot = 0, commandindex = 0; | ||
| 145 | struct mtip_cmd *command; | ||
| 146 | struct mtip_port *port = dd->port; | ||
| 147 | |||
| 148 | for (group = 0; group < 4; group++) { | ||
| 149 | for (commandslot = 0; commandslot < 32; commandslot++) { | ||
| 150 | if (!(port->allocated[group] & (1 << commandslot))) | ||
| 151 | continue; | ||
| 152 | |||
| 153 | commandindex = group << 5 | commandslot; | ||
| 154 | command = &port->commands[commandindex]; | ||
| 155 | |||
| 156 | if (atomic_read(&command->active) | ||
| 157 | && (command->async_callback)) { | ||
| 158 | command->async_callback(command->async_data, | ||
| 159 | -ENODEV); | ||
| 160 | command->async_callback = NULL; | ||
| 161 | command->async_data = NULL; | ||
| 162 | } | ||
| 163 | |||
| 164 | dma_unmap_sg(&port->dd->pdev->dev, | ||
| 165 | command->sg, | ||
| 166 | command->scatter_ents, | ||
| 167 | command->direction); | ||
| 168 | } | ||
| 169 | } | ||
| 170 | |||
| 171 | up(&port->cmd_slot); | ||
| 172 | |||
| 173 | atomic_set(&dd->drv_cleanup_done, true); | ||
| 174 | } | ||
| 175 | |||
| 176 | /* | ||
| 111 | * Obtain an empty command slot. | 177 | * Obtain an empty command slot. |
| 112 | * | 178 | * |
| 113 | * This function needs to be reentrant since it could be called | 179 | * This function needs to be reentrant since it could be called |
| @@ -167,214 +233,72 @@ static inline void release_slot(struct mtip_port *port, int tag) | |||
| 167 | } | 233 | } |
| 168 | 234 | ||
| 169 | /* | 235 | /* |
| 170 | * Issue a command to the hardware. | 236 | * Reset the HBA (without sleeping) |
| 171 | * | ||
| 172 | * Set the appropriate bit in the s_active and Command Issue hardware | ||
| 173 | * registers, causing hardware command processing to begin. | ||
| 174 | * | ||
| 175 | * @port Pointer to the port structure. | ||
| 176 | * @tag The tag of the command to be issued. | ||
| 177 | * | 237 | * |
| 178 | * return value | 238 | * Just like hba_reset, except does not call sleep, so can be |
| 179 | * None | 239 | * run from interrupt/tasklet context. |
| 180 | */ | ||
| 181 | static inline void mtip_issue_ncq_command(struct mtip_port *port, int tag) | ||
| 182 | { | ||
| 183 | unsigned long flags = 0; | ||
| 184 | |||
| 185 | atomic_set(&port->commands[tag].active, 1); | ||
| 186 | |||
| 187 | spin_lock_irqsave(&port->cmd_issue_lock, flags); | ||
| 188 | |||
| 189 | writel((1 << MTIP_TAG_BIT(tag)), | ||
| 190 | port->s_active[MTIP_TAG_INDEX(tag)]); | ||
| 191 | writel((1 << MTIP_TAG_BIT(tag)), | ||
| 192 | port->cmd_issue[MTIP_TAG_INDEX(tag)]); | ||
| 193 | |||
| 194 | spin_unlock_irqrestore(&port->cmd_issue_lock, flags); | ||
| 195 | } | ||
| 196 | |||
| 197 | /* | ||
| 198 | * Called periodically to see if any read/write commands are | ||
| 199 | * taking too long to complete. | ||
| 200 | * | 240 | * |
| 201 | * @data Pointer to the PORT data structure. | 241 | * @dd Pointer to the driver data structure. |
| 202 | * | 242 | * |
| 203 | * return value | 243 | * return value |
| 204 | * None | 244 | * 0 The reset was successful. |
| 245 | * -1 The HBA Reset bit did not clear. | ||
| 205 | */ | 246 | */ |
| 206 | void mtip_timeout_function(unsigned long int data) | 247 | static int hba_reset_nosleep(struct driver_data *dd) |
| 207 | { | 248 | { |
| 208 | struct mtip_port *port = (struct mtip_port *) data; | 249 | unsigned long timeout; |
| 209 | struct host_to_dev_fis *fis; | ||
| 210 | struct mtip_cmd *command; | ||
| 211 | int tag, cmdto_cnt = 0; | ||
| 212 | unsigned int bit, group; | ||
| 213 | unsigned int num_command_slots = port->dd->slot_groups * 32; | ||
| 214 | |||
| 215 | if (unlikely(!port)) | ||
| 216 | return; | ||
| 217 | |||
| 218 | if (atomic_read(&port->dd->resumeflag) == true) { | ||
| 219 | mod_timer(&port->cmd_timer, | ||
| 220 | jiffies + msecs_to_jiffies(30000)); | ||
| 221 | return; | ||
| 222 | } | ||
| 223 | |||
| 224 | for (tag = 0; tag < num_command_slots; tag++) { | ||
| 225 | /* | ||
| 226 | * Skip internal command slot as it has | ||
| 227 | * its own timeout mechanism | ||
| 228 | */ | ||
| 229 | if (tag == MTIP_TAG_INTERNAL) | ||
| 230 | continue; | ||
| 231 | |||
| 232 | if (atomic_read(&port->commands[tag].active) && | ||
| 233 | (time_after(jiffies, port->commands[tag].comp_time))) { | ||
| 234 | group = tag >> 5; | ||
| 235 | bit = tag & 0x1f; | ||
| 236 | |||
| 237 | command = &port->commands[tag]; | ||
| 238 | fis = (struct host_to_dev_fis *) command->command; | ||
| 239 | |||
| 240 | dev_warn(&port->dd->pdev->dev, | ||
| 241 | "Timeout for command tag %d\n", tag); | ||
| 242 | |||
| 243 | cmdto_cnt++; | ||
| 244 | if (cmdto_cnt == 1) | ||
| 245 | atomic_inc(&port->dd->eh_active); | ||
| 246 | |||
| 247 | /* | ||
| 248 | * Clear the completed bit. This should prevent | ||
| 249 | * any interrupt handlers from trying to retire | ||
| 250 | * the command. | ||
| 251 | */ | ||
| 252 | writel(1 << bit, port->completed[group]); | ||
| 253 | 250 | ||
| 254 | /* Call the async completion callback. */ | 251 | /* Chip quirk: quiesce any chip function */ |
| 255 | if (likely(command->async_callback)) | 252 | mdelay(10); |
| 256 | command->async_callback(command->async_data, | ||
| 257 | -EIO); | ||
| 258 | command->async_callback = NULL; | ||
| 259 | command->comp_func = NULL; | ||
| 260 | 253 | ||
| 261 | /* Unmap the DMA scatter list entries */ | 254 | /* Set the reset bit */ |
| 262 | dma_unmap_sg(&port->dd->pdev->dev, | 255 | writel(HOST_RESET, dd->mmio + HOST_CTL); |
| 263 | command->sg, | ||
| 264 | command->scatter_ents, | ||
| 265 | command->direction); | ||
| 266 | 256 | ||
| 267 | /* | 257 | /* Flush */ |
| 268 | * Clear the allocated bit and active tag for the | 258 | readl(dd->mmio + HOST_CTL); |
| 269 | * command. | ||
| 270 | */ | ||
| 271 | atomic_set(&port->commands[tag].active, 0); | ||
| 272 | release_slot(port, tag); | ||
| 273 | 259 | ||
| 274 | up(&port->cmd_slot); | 260 | /* |
| 275 | } | 261 | * Wait 10ms then spin for up to 1 second |
| 276 | } | 262 | * waiting for reset acknowledgement |
| 263 | */ | ||
| 264 | timeout = jiffies + msecs_to_jiffies(1000); | ||
| 265 | mdelay(10); | ||
| 266 | while ((readl(dd->mmio + HOST_CTL) & HOST_RESET) | ||
| 267 | && time_before(jiffies, timeout)) | ||
| 268 | mdelay(1); | ||
| 277 | 269 | ||
| 278 | if (cmdto_cnt) { | 270 | if (readl(dd->mmio + HOST_CTL) & HOST_RESET) |
| 279 | dev_warn(&port->dd->pdev->dev, | 271 | return -1; |
| 280 | "%d commands timed out: restarting port", | ||
| 281 | cmdto_cnt); | ||
| 282 | mtip_restart_port(port); | ||
| 283 | atomic_dec(&port->dd->eh_active); | ||
| 284 | } | ||
| 285 | 272 | ||
| 286 | /* Restart the timer */ | 273 | return 0; |
| 287 | mod_timer(&port->cmd_timer, | ||
| 288 | jiffies + msecs_to_jiffies(MTIP_TIMEOUT_CHECK_PERIOD)); | ||
| 289 | } | 274 | } |
| 290 | 275 | ||
| 291 | /* | 276 | /* |
| 292 | * IO completion function. | 277 | * Issue a command to the hardware. |
| 293 | * | 278 | * |
| 294 | * This completion function is called by the driver ISR when a | 279 | * Set the appropriate bit in the s_active and Command Issue hardware |
| 295 | * command that was issued by the kernel completes. It first calls the | 280 | * registers, causing hardware command processing to begin. |
| 296 | * asynchronous completion function which normally calls back into the block | ||
| 297 | * layer passing the asynchronous callback data, then unmaps the | ||
| 298 | * scatter list associated with the completed command, and finally | ||
| 299 | * clears the allocated bit associated with the completed command. | ||
| 300 | * | 281 | * |
| 301 | * @port Pointer to the port data structure. | 282 | * @port Pointer to the port structure. |
| 302 | * @tag Tag of the command. | 283 | * @tag The tag of the command to be issued. |
| 303 | * @data Pointer to driver_data. | ||
| 304 | * @status Completion status. | ||
| 305 | * | 284 | * |
| 306 | * return value | 285 | * return value |
| 307 | * None | 286 | * None |
| 308 | */ | 287 | */ |
| 309 | static void mtip_async_complete(struct mtip_port *port, | 288 | static inline void mtip_issue_ncq_command(struct mtip_port *port, int tag) |
| 310 | int tag, | ||
| 311 | void *data, | ||
| 312 | int status) | ||
| 313 | { | 289 | { |
| 314 | struct mtip_cmd *command; | 290 | unsigned long flags = 0; |
| 315 | struct driver_data *dd = data; | ||
| 316 | int cb_status = status ? -EIO : 0; | ||
| 317 | |||
| 318 | if (unlikely(!dd) || unlikely(!port)) | ||
| 319 | return; | ||
| 320 | |||
| 321 | command = &port->commands[tag]; | ||
| 322 | |||
| 323 | if (unlikely(status == PORT_IRQ_TF_ERR)) { | ||
| 324 | dev_warn(&port->dd->pdev->dev, | ||
| 325 | "Command tag %d failed due to TFE\n", tag); | ||
| 326 | } | ||
| 327 | |||
| 328 | /* Upper layer callback */ | ||
| 329 | if (likely(command->async_callback)) | ||
| 330 | command->async_callback(command->async_data, cb_status); | ||
| 331 | |||
| 332 | command->async_callback = NULL; | ||
| 333 | command->comp_func = NULL; | ||
| 334 | |||
| 335 | /* Unmap the DMA scatter list entries */ | ||
| 336 | dma_unmap_sg(&dd->pdev->dev, | ||
| 337 | command->sg, | ||
| 338 | command->scatter_ents, | ||
| 339 | command->direction); | ||
| 340 | |||
| 341 | /* Clear the allocated and active bits for the command */ | ||
| 342 | atomic_set(&port->commands[tag].active, 0); | ||
| 343 | release_slot(port, tag); | ||
| 344 | 291 | ||
| 345 | up(&port->cmd_slot); | 292 | atomic_set(&port->commands[tag].active, 1); |
| 346 | } | ||
| 347 | 293 | ||
| 348 | /* | 294 | spin_lock_irqsave(&port->cmd_issue_lock, flags); |
| 349 | * Internal command completion callback function. | ||
| 350 | * | ||
| 351 | * This function is normally called by the driver ISR when an internal | ||
| 352 | * command completed. This function signals the command completion by | ||
| 353 | * calling complete(). | ||
| 354 | * | ||
| 355 | * @port Pointer to the port data structure. | ||
| 356 | * @tag Tag of the command that has completed. | ||
| 357 | * @data Pointer to a completion structure. | ||
| 358 | * @status Completion status. | ||
| 359 | * | ||
| 360 | * return value | ||
| 361 | * None | ||
| 362 | */ | ||
| 363 | static void mtip_completion(struct mtip_port *port, | ||
| 364 | int tag, | ||
| 365 | void *data, | ||
| 366 | int status) | ||
| 367 | { | ||
| 368 | struct mtip_cmd *command = &port->commands[tag]; | ||
| 369 | struct completion *waiting = data; | ||
| 370 | if (unlikely(status == PORT_IRQ_TF_ERR)) | ||
| 371 | dev_warn(&port->dd->pdev->dev, | ||
| 372 | "Internal command %d completed with TFE\n", tag); | ||
| 373 | 295 | ||
| 374 | command->async_callback = NULL; | 296 | writel((1 << MTIP_TAG_BIT(tag)), |
| 375 | command->comp_func = NULL; | 297 | port->s_active[MTIP_TAG_INDEX(tag)]); |
| 298 | writel((1 << MTIP_TAG_BIT(tag)), | ||
| 299 | port->cmd_issue[MTIP_TAG_INDEX(tag)]); | ||
| 376 | 300 | ||
| 377 | complete(waiting); | 301 | spin_unlock_irqrestore(&port->cmd_issue_lock, flags); |
| 378 | } | 302 | } |
| 379 | 303 | ||
| 380 | /* | 304 | /* |
| @@ -508,47 +432,6 @@ static void mtip_init_port(struct mtip_port *port) | |||
| 508 | } | 432 | } |
| 509 | 433 | ||
| 510 | /* | 434 | /* |
| 511 | * Reset the HBA (without sleeping) | ||
| 512 | * | ||
| 513 | * Just like hba_reset, except does not call sleep, so can be | ||
| 514 | * run from interrupt/tasklet context. | ||
| 515 | * | ||
| 516 | * @dd Pointer to the driver data structure. | ||
| 517 | * | ||
| 518 | * return value | ||
| 519 | * 0 The reset was successful. | ||
| 520 | * -1 The HBA Reset bit did not clear. | ||
| 521 | */ | ||
| 522 | int hba_reset_nosleep(struct driver_data *dd) | ||
| 523 | { | ||
| 524 | unsigned long timeout; | ||
| 525 | |||
| 526 | /* Chip quirk: quiesce any chip function */ | ||
| 527 | mdelay(10); | ||
| 528 | |||
| 529 | /* Set the reset bit */ | ||
| 530 | writel(HOST_RESET, dd->mmio + HOST_CTL); | ||
| 531 | |||
| 532 | /* Flush */ | ||
| 533 | readl(dd->mmio + HOST_CTL); | ||
| 534 | |||
| 535 | /* | ||
| 536 | * Wait 10ms then spin for up to 1 second | ||
| 537 | * waiting for reset acknowledgement | ||
| 538 | */ | ||
| 539 | timeout = jiffies + msecs_to_jiffies(1000); | ||
| 540 | mdelay(10); | ||
| 541 | while ((readl(dd->mmio + HOST_CTL) & HOST_RESET) | ||
| 542 | && time_before(jiffies, timeout)) | ||
| 543 | mdelay(1); | ||
| 544 | |||
| 545 | if (readl(dd->mmio + HOST_CTL) & HOST_RESET) | ||
| 546 | return -1; | ||
| 547 | |||
| 548 | return 0; | ||
| 549 | } | ||
| 550 | |||
| 551 | /* | ||
| 552 | * Restart a port | 435 | * Restart a port |
| 553 | * | 436 | * |
| 554 | * @port Pointer to the port data structure. | 437 | * @port Pointer to the port data structure. |
| @@ -556,7 +439,7 @@ int hba_reset_nosleep(struct driver_data *dd) | |||
| 556 | * return value | 439 | * return value |
| 557 | * None | 440 | * None |
| 558 | */ | 441 | */ |
| 559 | void mtip_restart_port(struct mtip_port *port) | 442 | static void mtip_restart_port(struct mtip_port *port) |
| 560 | { | 443 | { |
| 561 | unsigned long timeout; | 444 | unsigned long timeout; |
| 562 | 445 | ||
| @@ -620,6 +503,189 @@ void mtip_restart_port(struct mtip_port *port) | |||
| 620 | } | 503 | } |
| 621 | 504 | ||
| 622 | /* | 505 | /* |
| 506 | * Called periodically to see if any read/write commands are | ||
| 507 | * taking too long to complete. | ||
| 508 | * | ||
| 509 | * @data Pointer to the PORT data structure. | ||
| 510 | * | ||
| 511 | * return value | ||
| 512 | * None | ||
| 513 | */ | ||
| 514 | static void mtip_timeout_function(unsigned long int data) | ||
| 515 | { | ||
| 516 | struct mtip_port *port = (struct mtip_port *) data; | ||
| 517 | struct host_to_dev_fis *fis; | ||
| 518 | struct mtip_cmd *command; | ||
| 519 | int tag, cmdto_cnt = 0; | ||
| 520 | unsigned int bit, group; | ||
| 521 | unsigned int num_command_slots = port->dd->slot_groups * 32; | ||
| 522 | |||
| 523 | if (unlikely(!port)) | ||
| 524 | return; | ||
| 525 | |||
| 526 | if (atomic_read(&port->dd->resumeflag) == true) { | ||
| 527 | mod_timer(&port->cmd_timer, | ||
| 528 | jiffies + msecs_to_jiffies(30000)); | ||
| 529 | return; | ||
| 530 | } | ||
| 531 | |||
| 532 | for (tag = 0; tag < num_command_slots; tag++) { | ||
| 533 | /* | ||
| 534 | * Skip internal command slot as it has | ||
| 535 | * its own timeout mechanism | ||
| 536 | */ | ||
| 537 | if (tag == MTIP_TAG_INTERNAL) | ||
| 538 | continue; | ||
| 539 | |||
| 540 | if (atomic_read(&port->commands[tag].active) && | ||
| 541 | (time_after(jiffies, port->commands[tag].comp_time))) { | ||
| 542 | group = tag >> 5; | ||
| 543 | bit = tag & 0x1f; | ||
| 544 | |||
| 545 | command = &port->commands[tag]; | ||
| 546 | fis = (struct host_to_dev_fis *) command->command; | ||
| 547 | |||
| 548 | dev_warn(&port->dd->pdev->dev, | ||
| 549 | "Timeout for command tag %d\n", tag); | ||
| 550 | |||
| 551 | cmdto_cnt++; | ||
| 552 | if (cmdto_cnt == 1) | ||
| 553 | atomic_inc(&port->dd->eh_active); | ||
| 554 | |||
| 555 | /* | ||
| 556 | * Clear the completed bit. This should prevent | ||
| 557 | * any interrupt handlers from trying to retire | ||
| 558 | * the command. | ||
| 559 | */ | ||
| 560 | writel(1 << bit, port->completed[group]); | ||
| 561 | |||
| 562 | /* Call the async completion callback. */ | ||
| 563 | if (likely(command->async_callback)) | ||
| 564 | command->async_callback(command->async_data, | ||
| 565 | -EIO); | ||
| 566 | command->async_callback = NULL; | ||
| 567 | command->comp_func = NULL; | ||
| 568 | |||
| 569 | /* Unmap the DMA scatter list entries */ | ||
| 570 | dma_unmap_sg(&port->dd->pdev->dev, | ||
| 571 | command->sg, | ||
| 572 | command->scatter_ents, | ||
| 573 | command->direction); | ||
| 574 | |||
| 575 | /* | ||
| 576 | * Clear the allocated bit and active tag for the | ||
| 577 | * command. | ||
| 578 | */ | ||
| 579 | atomic_set(&port->commands[tag].active, 0); | ||
| 580 | release_slot(port, tag); | ||
| 581 | |||
| 582 | up(&port->cmd_slot); | ||
| 583 | } | ||
| 584 | } | ||
| 585 | |||
| 586 | if (cmdto_cnt) { | ||
| 587 | dev_warn(&port->dd->pdev->dev, | ||
| 588 | "%d commands timed out: restarting port", | ||
| 589 | cmdto_cnt); | ||
| 590 | mtip_restart_port(port); | ||
| 591 | atomic_dec(&port->dd->eh_active); | ||
| 592 | } | ||
| 593 | |||
| 594 | /* Restart the timer */ | ||
| 595 | mod_timer(&port->cmd_timer, | ||
| 596 | jiffies + msecs_to_jiffies(MTIP_TIMEOUT_CHECK_PERIOD)); | ||
| 597 | } | ||
| 598 | |||
| 599 | /* | ||
| 600 | * IO completion function. | ||
| 601 | * | ||
| 602 | * This completion function is called by the driver ISR when a | ||
| 603 | * command that was issued by the kernel completes. It first calls the | ||
| 604 | * asynchronous completion function which normally calls back into the block | ||
| 605 | * layer passing the asynchronous callback data, then unmaps the | ||
| 606 | * scatter list associated with the completed command, and finally | ||
| 607 | * clears the allocated bit associated with the completed command. | ||
| 608 | * | ||
| 609 | * @port Pointer to the port data structure. | ||
| 610 | * @tag Tag of the command. | ||
| 611 | * @data Pointer to driver_data. | ||
| 612 | * @status Completion status. | ||
| 613 | * | ||
| 614 | * return value | ||
| 615 | * None | ||
| 616 | */ | ||
| 617 | static void mtip_async_complete(struct mtip_port *port, | ||
| 618 | int tag, | ||
| 619 | void *data, | ||
| 620 | int status) | ||
| 621 | { | ||
| 622 | struct mtip_cmd *command; | ||
| 623 | struct driver_data *dd = data; | ||
| 624 | int cb_status = status ? -EIO : 0; | ||
| 625 | |||
| 626 | if (unlikely(!dd) || unlikely(!port)) | ||
| 627 | return; | ||
| 628 | |||
| 629 | command = &port->commands[tag]; | ||
| 630 | |||
| 631 | if (unlikely(status == PORT_IRQ_TF_ERR)) { | ||
| 632 | dev_warn(&port->dd->pdev->dev, | ||
| 633 | "Command tag %d failed due to TFE\n", tag); | ||
| 634 | } | ||
| 635 | |||
| 636 | /* Upper layer callback */ | ||
| 637 | if (likely(command->async_callback)) | ||
| 638 | command->async_callback(command->async_data, cb_status); | ||
| 639 | |||
| 640 | command->async_callback = NULL; | ||
| 641 | command->comp_func = NULL; | ||
| 642 | |||
| 643 | /* Unmap the DMA scatter list entries */ | ||
| 644 | dma_unmap_sg(&dd->pdev->dev, | ||
| 645 | command->sg, | ||
| 646 | command->scatter_ents, | ||
| 647 | command->direction); | ||
| 648 | |||
| 649 | /* Clear the allocated and active bits for the command */ | ||
| 650 | atomic_set(&port->commands[tag].active, 0); | ||
| 651 | release_slot(port, tag); | ||
| 652 | |||
| 653 | up(&port->cmd_slot); | ||
| 654 | } | ||
| 655 | |||
| 656 | /* | ||
| 657 | * Internal command completion callback function. | ||
| 658 | * | ||
| 659 | * This function is normally called by the driver ISR when an internal | ||
| 660 | * command completed. This function signals the command completion by | ||
| 661 | * calling complete(). | ||
| 662 | * | ||
| 663 | * @port Pointer to the port data structure. | ||
| 664 | * @tag Tag of the command that has completed. | ||
| 665 | * @data Pointer to a completion structure. | ||
| 666 | * @status Completion status. | ||
| 667 | * | ||
| 668 | * return value | ||
| 669 | * None | ||
| 670 | */ | ||
| 671 | static void mtip_completion(struct mtip_port *port, | ||
| 672 | int tag, | ||
| 673 | void *data, | ||
| 674 | int status) | ||
| 675 | { | ||
| 676 | struct mtip_cmd *command = &port->commands[tag]; | ||
| 677 | struct completion *waiting = data; | ||
| 678 | if (unlikely(status == PORT_IRQ_TF_ERR)) | ||
| 679 | dev_warn(&port->dd->pdev->dev, | ||
| 680 | "Internal command %d completed with TFE\n", tag); | ||
| 681 | |||
| 682 | command->async_callback = NULL; | ||
| 683 | command->comp_func = NULL; | ||
| 684 | |||
| 685 | complete(waiting); | ||
| 686 | } | ||
| 687 | |||
| 688 | /* | ||
| 623 | * Helper function for tag logging | 689 | * Helper function for tag logging |
| 624 | */ | 690 | */ |
| 625 | static void print_tags(struct driver_data *dd, | 691 | static void print_tags(struct driver_data *dd, |
| @@ -1276,7 +1342,7 @@ static int mtip_standby_immediate(struct mtip_port *port) | |||
| 1276 | * 1 Capacity was returned successfully. | 1342 | * 1 Capacity was returned successfully. |
| 1277 | * 0 The identify information is invalid. | 1343 | * 0 The identify information is invalid. |
| 1278 | */ | 1344 | */ |
| 1279 | bool mtip_hw_get_capacity(struct driver_data *dd, sector_t *sectors) | 1345 | static bool mtip_hw_get_capacity(struct driver_data *dd, sector_t *sectors) |
| 1280 | { | 1346 | { |
| 1281 | struct mtip_port *port = dd->port; | 1347 | struct mtip_port *port = dd->port; |
| 1282 | u64 total, raw0, raw1, raw2, raw3; | 1348 | u64 total, raw0, raw1, raw2, raw3; |
| @@ -1423,7 +1489,7 @@ static inline void fill_command_sg(struct driver_data *dd, | |||
| 1423 | * return value 0 The command completed successfully. | 1489 | * return value 0 The command completed successfully. |
| 1424 | * return value -1 An error occurred while executing the command. | 1490 | * return value -1 An error occurred while executing the command. |
| 1425 | */ | 1491 | */ |
| 1426 | int exec_drive_task(struct mtip_port *port, u8 *command) | 1492 | static int exec_drive_task(struct mtip_port *port, u8 *command) |
| 1427 | { | 1493 | { |
| 1428 | struct host_to_dev_fis fis; | 1494 | struct host_to_dev_fis fis; |
| 1429 | struct host_to_dev_fis *reply = (port->rxfis + RX_FIS_D2H_REG); | 1495 | struct host_to_dev_fis *reply = (port->rxfis + RX_FIS_D2H_REG); |
| @@ -1499,8 +1565,8 @@ int exec_drive_task(struct mtip_port *port, u8 *command) | |||
| 1499 | * data to the user space buffer. | 1565 | * data to the user space buffer. |
| 1500 | * return value -1 An error occurred while executing the command. | 1566 | * return value -1 An error occurred while executing the command. |
| 1501 | */ | 1567 | */ |
| 1502 | int exec_drive_command(struct mtip_port *port, u8 *command, | 1568 | static int exec_drive_command(struct mtip_port *port, u8 *command, |
| 1503 | void __user *user_buffer) | 1569 | void __user *user_buffer) |
| 1504 | { | 1570 | { |
| 1505 | struct host_to_dev_fis fis; | 1571 | struct host_to_dev_fis fis; |
| 1506 | struct host_to_dev_fis *reply = (port->rxfis + RX_FIS_D2H_REG); | 1572 | struct host_to_dev_fis *reply = (port->rxfis + RX_FIS_D2H_REG); |
| @@ -2020,15 +2086,9 @@ static int mtip_hw_ioctl(struct driver_data *dd, unsigned int cmd, | |||
| 2020 | * return value | 2086 | * return value |
| 2021 | * None | 2087 | * None |
| 2022 | */ | 2088 | */ |
| 2023 | void mtip_hw_submit_io(struct driver_data *dd, | 2089 | static void mtip_hw_submit_io(struct driver_data *dd, sector_t start, |
| 2024 | sector_t start, | 2090 | int nsect, int nents, int tag, void *callback, |
| 2025 | int nsect, | 2091 | void *data, int barrier, int dir) |
| 2026 | int nents, | ||
| 2027 | int tag, | ||
| 2028 | void *callback, | ||
| 2029 | void *data, | ||
| 2030 | int barrier, | ||
| 2031 | int dir) | ||
| 2032 | { | 2092 | { |
| 2033 | struct host_to_dev_fis *fis; | 2093 | struct host_to_dev_fis *fis; |
| 2034 | struct mtip_port *port = dd->port; | 2094 | struct mtip_port *port = dd->port; |
| @@ -2115,7 +2175,7 @@ void mtip_hw_submit_io(struct driver_data *dd, | |||
| 2115 | * return value | 2175 | * return value |
| 2116 | * None | 2176 | * None |
| 2117 | */ | 2177 | */ |
| 2118 | void mtip_hw_release_scatterlist(struct driver_data *dd, int tag) | 2178 | static void mtip_hw_release_scatterlist(struct driver_data *dd, int tag) |
| 2119 | { | 2179 | { |
| 2120 | release_slot(dd->port, tag); | 2180 | release_slot(dd->port, tag); |
| 2121 | } | 2181 | } |
| @@ -2131,8 +2191,8 @@ void mtip_hw_release_scatterlist(struct driver_data *dd, int tag) | |||
| 2131 | * Pointer to the scatter list for the allocated command slot | 2191 | * Pointer to the scatter list for the allocated command slot |
| 2132 | * or NULL if no command slots are available. | 2192 | * or NULL if no command slots are available. |
| 2133 | */ | 2193 | */ |
| 2134 | struct scatterlist *mtip_hw_get_scatterlist(struct driver_data *dd, | 2194 | static struct scatterlist *mtip_hw_get_scatterlist(struct driver_data *dd, |
| 2135 | int *tag) | 2195 | int *tag) |
| 2136 | { | 2196 | { |
| 2137 | /* | 2197 | /* |
| 2138 | * It is possible that, even with this semaphore, a thread | 2198 | * It is possible that, even with this semaphore, a thread |
| @@ -2216,7 +2276,7 @@ static DEVICE_ATTR(registers, S_IRUGO, hw_show_registers, NULL); | |||
| 2216 | * 0 Operation completed successfully. | 2276 | * 0 Operation completed successfully. |
| 2217 | * -EINVAL Invalid parameter. | 2277 | * -EINVAL Invalid parameter. |
| 2218 | */ | 2278 | */ |
| 2219 | int mtip_hw_sysfs_init(struct driver_data *dd, struct kobject *kobj) | 2279 | static int mtip_hw_sysfs_init(struct driver_data *dd, struct kobject *kobj) |
| 2220 | { | 2280 | { |
| 2221 | if (!kobj || !dd) | 2281 | if (!kobj || !dd) |
| 2222 | return -EINVAL; | 2282 | return -EINVAL; |
| @@ -2237,7 +2297,7 @@ int mtip_hw_sysfs_init(struct driver_data *dd, struct kobject *kobj) | |||
| 2237 | * 0 Operation completed successfully. | 2297 | * 0 Operation completed successfully. |
| 2238 | * -EINVAL Invalid parameter. | 2298 | * -EINVAL Invalid parameter. |
| 2239 | */ | 2299 | */ |
| 2240 | int mtip_hw_sysfs_exit(struct driver_data *dd, struct kobject *kobj) | 2300 | static int mtip_hw_sysfs_exit(struct driver_data *dd, struct kobject *kobj) |
| 2241 | { | 2301 | { |
| 2242 | if (!kobj || !dd) | 2302 | if (!kobj || !dd) |
| 2243 | return -EINVAL; | 2303 | return -EINVAL; |
| @@ -2385,7 +2445,7 @@ static int mtip_ftl_rebuild_poll(struct driver_data *dd) | |||
| 2385 | * return value | 2445 | * return value |
| 2386 | * 0 on success, else an error code. | 2446 | * 0 on success, else an error code. |
| 2387 | */ | 2447 | */ |
| 2388 | int mtip_hw_init(struct driver_data *dd) | 2448 | static int mtip_hw_init(struct driver_data *dd) |
| 2389 | { | 2449 | { |
| 2390 | int i; | 2450 | int i; |
| 2391 | int rv; | 2451 | int rv; |
| @@ -2586,7 +2646,7 @@ out1: | |||
| 2586 | * return value | 2646 | * return value |
| 2587 | * 0 | 2647 | * 0 |
| 2588 | */ | 2648 | */ |
| 2589 | int mtip_hw_exit(struct driver_data *dd) | 2649 | static int mtip_hw_exit(struct driver_data *dd) |
| 2590 | { | 2650 | { |
| 2591 | /* | 2651 | /* |
| 2592 | * Send standby immediate (E0h) to the drive so that it | 2652 | * Send standby immediate (E0h) to the drive so that it |
| @@ -2634,7 +2694,7 @@ int mtip_hw_exit(struct driver_data *dd) | |||
| 2634 | * return value | 2694 | * return value |
| 2635 | * 0 | 2695 | * 0 |
| 2636 | */ | 2696 | */ |
| 2637 | int mtip_hw_shutdown(struct driver_data *dd) | 2697 | static int mtip_hw_shutdown(struct driver_data *dd) |
| 2638 | { | 2698 | { |
| 2639 | /* | 2699 | /* |
| 2640 | * Send standby immediate (E0h) to the drive so that it | 2700 | * Send standby immediate (E0h) to the drive so that it |
| @@ -2657,7 +2717,7 @@ int mtip_hw_shutdown(struct driver_data *dd) | |||
| 2657 | * 0 Suspend was successful | 2717 | * 0 Suspend was successful |
| 2658 | * -EFAULT Suspend was not successful | 2718 | * -EFAULT Suspend was not successful |
| 2659 | */ | 2719 | */ |
| 2660 | int mtip_hw_suspend(struct driver_data *dd) | 2720 | static int mtip_hw_suspend(struct driver_data *dd) |
| 2661 | { | 2721 | { |
| 2662 | /* | 2722 | /* |
| 2663 | * Send standby immediate (E0h) to the drive | 2723 | * Send standby immediate (E0h) to the drive |
| @@ -2689,7 +2749,7 @@ int mtip_hw_suspend(struct driver_data *dd) | |||
| 2689 | * 0 Resume was successful | 2749 | * 0 Resume was successful |
| 2690 | * -EFAULT Resume was not successful | 2750 | * -EFAULT Resume was not successful |
| 2691 | */ | 2751 | */ |
| 2692 | int mtip_hw_resume(struct driver_data *dd) | 2752 | static int mtip_hw_resume(struct driver_data *dd) |
| 2693 | { | 2753 | { |
| 2694 | /* Perform any needed hardware setup steps */ | 2754 | /* Perform any needed hardware setup steps */ |
| 2695 | hba_setup(dd); | 2755 | hba_setup(dd); |
| @@ -2716,50 +2776,6 @@ int mtip_hw_resume(struct driver_data *dd) | |||
| 2716 | } | 2776 | } |
| 2717 | 2777 | ||
| 2718 | /* | 2778 | /* |
| 2719 | * This function is called for clean the pending command in the | ||
| 2720 | * command slot during the surprise removal of device and return | ||
| 2721 | * error to the upper layer. | ||
| 2722 | * | ||
| 2723 | * @dd Pointer to the DRIVER_DATA structure. | ||
| 2724 | * | ||
| 2725 | * return value | ||
| 2726 | * None | ||
| 2727 | */ | ||
| 2728 | void mtip_command_cleanup(struct driver_data *dd) | ||
| 2729 | { | ||
| 2730 | int group = 0, commandslot = 0, commandindex = 0; | ||
| 2731 | struct mtip_cmd *command; | ||
| 2732 | struct mtip_port *port = dd->port; | ||
| 2733 | |||
| 2734 | for (group = 0; group < 4; group++) { | ||
| 2735 | for (commandslot = 0; commandslot < 32; commandslot++) { | ||
| 2736 | if (!(port->allocated[group] & (1 << commandslot))) | ||
| 2737 | continue; | ||
| 2738 | |||
| 2739 | commandindex = group << 5 | commandslot; | ||
| 2740 | command = &port->commands[commandindex]; | ||
| 2741 | |||
| 2742 | if (atomic_read(&command->active) | ||
| 2743 | && (command->async_callback)) { | ||
| 2744 | command->async_callback(command->async_data, | ||
| 2745 | -ENODEV); | ||
| 2746 | command->async_callback = NULL; | ||
| 2747 | command->async_data = NULL; | ||
| 2748 | } | ||
| 2749 | |||
| 2750 | dma_unmap_sg(&port->dd->pdev->dev, | ||
| 2751 | command->sg, | ||
| 2752 | command->scatter_ents, | ||
| 2753 | command->direction); | ||
| 2754 | } | ||
| 2755 | } | ||
| 2756 | |||
| 2757 | up(&port->cmd_slot); | ||
| 2758 | |||
| 2759 | atomic_set(&dd->drv_cleanup_done, true); | ||
| 2760 | } | ||
| 2761 | |||
| 2762 | /* | ||
| 2763 | * Helper function for reusing disk name | 2779 | * Helper function for reusing disk name |
| 2764 | * upon hot insertion. | 2780 | * upon hot insertion. |
| 2765 | */ | 2781 | */ |
| @@ -3037,7 +3053,7 @@ static int mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
| 3037 | * return value | 3053 | * return value |
| 3038 | * 0 on success else an error code. | 3054 | * 0 on success else an error code. |
| 3039 | */ | 3055 | */ |
| 3040 | int mtip_block_initialize(struct driver_data *dd) | 3056 | static int mtip_block_initialize(struct driver_data *dd) |
| 3041 | { | 3057 | { |
| 3042 | int rv = 0; | 3058 | int rv = 0; |
| 3043 | sector_t capacity; | 3059 | sector_t capacity; |
| @@ -3168,7 +3184,7 @@ protocol_init_error: | |||
| 3168 | * return value | 3184 | * return value |
| 3169 | * 0 | 3185 | * 0 |
| 3170 | */ | 3186 | */ |
| 3171 | int mtip_block_remove(struct driver_data *dd) | 3187 | static int mtip_block_remove(struct driver_data *dd) |
| 3172 | { | 3188 | { |
| 3173 | struct kobject *kobj; | 3189 | struct kobject *kobj; |
| 3174 | /* Clean up the sysfs attributes managed by the protocol layer. */ | 3190 | /* Clean up the sysfs attributes managed by the protocol layer. */ |
| @@ -3205,7 +3221,7 @@ int mtip_block_remove(struct driver_data *dd) | |||
| 3205 | * return value | 3221 | * return value |
| 3206 | * 0 | 3222 | * 0 |
| 3207 | */ | 3223 | */ |
| 3208 | int mtip_block_shutdown(struct driver_data *dd) | 3224 | static int mtip_block_shutdown(struct driver_data *dd) |
| 3209 | { | 3225 | { |
| 3210 | dev_info(&dd->pdev->dev, | 3226 | dev_info(&dd->pdev->dev, |
| 3211 | "Shutting down %s ...\n", dd->disk->disk_name); | 3227 | "Shutting down %s ...\n", dd->disk->disk_name); |
| @@ -3220,7 +3236,7 @@ int mtip_block_shutdown(struct driver_data *dd) | |||
| 3220 | return 0; | 3236 | return 0; |
| 3221 | } | 3237 | } |
| 3222 | 3238 | ||
| 3223 | int mtip_block_suspend(struct driver_data *dd) | 3239 | static int mtip_block_suspend(struct driver_data *dd) |
| 3224 | { | 3240 | { |
| 3225 | dev_info(&dd->pdev->dev, | 3241 | dev_info(&dd->pdev->dev, |
| 3226 | "Suspending %s ...\n", dd->disk->disk_name); | 3242 | "Suspending %s ...\n", dd->disk->disk_name); |
| @@ -3228,7 +3244,7 @@ int mtip_block_suspend(struct driver_data *dd) | |||
| 3228 | return 0; | 3244 | return 0; |
| 3229 | } | 3245 | } |
| 3230 | 3246 | ||
| 3231 | int mtip_block_resume(struct driver_data *dd) | 3247 | static int mtip_block_resume(struct driver_data *dd) |
| 3232 | { | 3248 | { |
| 3233 | dev_info(&dd->pdev->dev, "Resuming %s ...\n", | 3249 | dev_info(&dd->pdev->dev, "Resuming %s ...\n", |
| 3234 | dd->disk->disk_name); | 3250 | dd->disk->disk_name); |
| @@ -3479,28 +3495,6 @@ static void mtip_pci_shutdown(struct pci_dev *pdev) | |||
| 3479 | mtip_block_shutdown(dd); | 3495 | mtip_block_shutdown(dd); |
| 3480 | } | 3496 | } |
| 3481 | 3497 | ||
| 3482 | /* | ||
| 3483 | * This function check_for_surprise_removal is called | ||
| 3484 | * while card is removed from the system and it will | ||
| 3485 | * read the vendor id from the configration space | ||
| 3486 | * | ||
| 3487 | * @pdev Pointer to the pci_dev structure. | ||
| 3488 | * | ||
| 3489 | * return value | ||
| 3490 | * true if device removed, else false | ||
| 3491 | */ | ||
| 3492 | bool mtip_check_surprise_removal(struct pci_dev *pdev) | ||
| 3493 | { | ||
| 3494 | u16 vendor_id = 0; | ||
| 3495 | |||
| 3496 | /* Read the vendorID from the configuration space */ | ||
| 3497 | pci_read_config_word(pdev, 0x00, &vendor_id); | ||
| 3498 | if (vendor_id == 0xFFFF) | ||
| 3499 | return true; /* device removed */ | ||
| 3500 | |||
| 3501 | return false; /* device present */ | ||
| 3502 | } | ||
| 3503 | |||
| 3504 | /* Table of device ids supported by this driver. */ | 3498 | /* Table of device ids supported by this driver. */ |
| 3505 | static DEFINE_PCI_DEVICE_TABLE(mtip_pci_tbl) = { | 3499 | static DEFINE_PCI_DEVICE_TABLE(mtip_pci_tbl) = { |
| 3506 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320_DEVICE_ID) }, | 3500 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320_DEVICE_ID) }, |
diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h index d6355c6f218f..17be4f444e7d 100644 --- a/drivers/block/mtip32xx/mtip32xx.h +++ b/drivers/block/mtip32xx/mtip32xx.h | |||
| @@ -405,37 +405,4 @@ struct driver_data { | |||
| 405 | atomic_t eh_active; /* Flag for error handling tracking */ | 405 | atomic_t eh_active; /* Flag for error handling tracking */ |
| 406 | }; | 406 | }; |
| 407 | 407 | ||
| 408 | /* Function declarations */ | ||
| 409 | extern int mtip_block_initialize(struct driver_data *dd); | ||
| 410 | extern int mtip_block_remove(struct driver_data *dd); | ||
| 411 | extern int mtip_block_shutdown(struct driver_data *dd); | ||
| 412 | extern int mtip_block_suspend(struct driver_data *dd); | ||
| 413 | extern int mtip_block_resume(struct driver_data *dd); | ||
| 414 | extern int mtip_hw_init(struct driver_data *dd); | ||
| 415 | extern int mtip_hw_exit(struct driver_data *dd); | ||
| 416 | extern int mtip_hw_shutdown(struct driver_data *dd); | ||
| 417 | extern bool mtip_hw_get_capacity(struct driver_data *dd, sector_t *sectors); | ||
| 418 | extern void mtip_hw_release_scatterlist( | ||
| 419 | struct driver_data *dd, | ||
| 420 | int tag); | ||
| 421 | extern struct scatterlist *mtip_hw_get_scatterlist( | ||
| 422 | struct driver_data *dd, | ||
| 423 | int *tag); | ||
| 424 | extern void mtip_hw_submit_io(struct driver_data *dd, | ||
| 425 | sector_t start, | ||
| 426 | int nsect, | ||
| 427 | int nents, | ||
| 428 | int tag, | ||
| 429 | void *callback, | ||
| 430 | void *data, | ||
| 431 | int barrier, | ||
| 432 | int dir); | ||
| 433 | extern int mtip_hw_sysfs_init(struct driver_data *dd, struct kobject *kobj); | ||
| 434 | extern int mtip_hw_sysfs_exit(struct driver_data *dd, struct kobject *kobj); | ||
| 435 | extern int mtip_hw_resume(struct driver_data *dd); | ||
| 436 | extern int mtip_hw_suspend(struct driver_data *dd); | ||
| 437 | void mtip_command_cleanup(struct driver_data *dd); | ||
| 438 | bool mtip_check_surprise_removal(struct pci_dev *pdev); | ||
| 439 | void mtip_restart_port(struct mtip_port *port); | ||
| 440 | |||
| 441 | #endif | 408 | #endif |
