| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * driver for Microsemi PQI-based storage controllers |
|---|
| 3 | | - * Copyright (c) 2016-2017 Microsemi Corporation |
|---|
| 4 | + * Copyright (c) 2019-2020 Microchip Technology Inc. and its subsidiaries |
|---|
| 5 | + * Copyright (c) 2016-2018 Microsemi Corporation |
|---|
| 4 | 6 | * Copyright (c) 2016 PMC-Sierra, Inc. |
|---|
| 5 | 7 | * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 8 | | - * the Free Software Foundation; version 2 of the License. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 12 | | - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or |
|---|
| 13 | | - * NON INFRINGEMENT. See the GNU General Public License for more details. |
|---|
| 14 | | - * |
|---|
| 15 | | - * Questions/Comments/Bugfixes to esc.storagedev@microsemi.com |
|---|
| 8 | + * Questions/Comments/Bugfixes to storagedev@microchip.com |
|---|
| 16 | 9 | * |
|---|
| 17 | 10 | */ |
|---|
| 18 | 11 | |
|---|
| .. | .. |
|---|
| 34 | 27 | #define SIS_REENABLE_SIS_MODE 0x1 |
|---|
| 35 | 28 | #define SIS_ENABLE_MSIX 0x40 |
|---|
| 36 | 29 | #define SIS_ENABLE_INTX 0x80 |
|---|
| 30 | +#define SIS_SOFT_RESET 0x100 |
|---|
| 37 | 31 | #define SIS_CMD_READY 0x200 |
|---|
| 38 | 32 | #define SIS_TRIGGER_SHUTDOWN 0x800000 |
|---|
| 39 | 33 | #define SIS_PQI_RESET_QUIESCE 0x1000000 |
|---|
| .. | .. |
|---|
| 90 | 84 | unsigned long timeout; |
|---|
| 91 | 85 | u32 status; |
|---|
| 92 | 86 | |
|---|
| 93 | | - timeout = (timeout_secs * HZ) + jiffies; |
|---|
| 87 | + timeout = (timeout_secs * PQI_HZ) + jiffies; |
|---|
| 94 | 88 | |
|---|
| 95 | 89 | while (1) { |
|---|
| 96 | 90 | status = readl(&ctrl_info->registers->sis_firmware_status); |
|---|
| .. | .. |
|---|
| 202 | 196 | * the top of the loop in order to give the controller time to start |
|---|
| 203 | 197 | * processing the command before we start polling. |
|---|
| 204 | 198 | */ |
|---|
| 205 | | - timeout = (SIS_CMD_COMPLETE_TIMEOUT_SECS * HZ) + jiffies; |
|---|
| 199 | + timeout = (SIS_CMD_COMPLETE_TIMEOUT_SECS * PQI_HZ) + jiffies; |
|---|
| 206 | 200 | while (1) { |
|---|
| 207 | 201 | msleep(SIS_CMD_COMPLETE_POLL_INTERVAL_MSECS); |
|---|
| 208 | 202 | doorbell = readl(®isters->sis_ctrl_to_host_doorbell); |
|---|
| .. | .. |
|---|
| 316 | 310 | put_unaligned_le32(ctrl_info->max_io_slots, |
|---|
| 317 | 311 | &base_struct->error_buffer_num_elements); |
|---|
| 318 | 312 | |
|---|
| 319 | | - bus_address = pci_map_single(ctrl_info->pci_dev, base_struct, |
|---|
| 320 | | - sizeof(*base_struct), PCI_DMA_TODEVICE); |
|---|
| 321 | | - if (pci_dma_mapping_error(ctrl_info->pci_dev, bus_address)) { |
|---|
| 313 | + bus_address = dma_map_single(&ctrl_info->pci_dev->dev, base_struct, |
|---|
| 314 | + sizeof(*base_struct), DMA_TO_DEVICE); |
|---|
| 315 | + if (dma_mapping_error(&ctrl_info->pci_dev->dev, bus_address)) { |
|---|
| 322 | 316 | rc = -ENOMEM; |
|---|
| 323 | 317 | goto out; |
|---|
| 324 | 318 | } |
|---|
| .. | .. |
|---|
| 331 | 325 | rc = sis_send_sync_cmd(ctrl_info, SIS_CMD_INIT_BASE_STRUCT_ADDRESS, |
|---|
| 332 | 326 | ¶ms); |
|---|
| 333 | 327 | |
|---|
| 334 | | - pci_unmap_single(ctrl_info->pci_dev, bus_address, sizeof(*base_struct), |
|---|
| 335 | | - PCI_DMA_TODEVICE); |
|---|
| 336 | | - |
|---|
| 328 | + dma_unmap_single(&ctrl_info->pci_dev->dev, bus_address, |
|---|
| 329 | + sizeof(*base_struct), DMA_TO_DEVICE); |
|---|
| 337 | 330 | out: |
|---|
| 338 | 331 | kfree(base_struct_unaligned); |
|---|
| 339 | 332 | |
|---|
| .. | .. |
|---|
| 349 | 342 | u32 doorbell_register; |
|---|
| 350 | 343 | unsigned long timeout; |
|---|
| 351 | 344 | |
|---|
| 352 | | - timeout = (SIS_DOORBELL_BIT_CLEAR_TIMEOUT_SECS * HZ) + jiffies; |
|---|
| 345 | + timeout = (SIS_DOORBELL_BIT_CLEAR_TIMEOUT_SECS * PQI_HZ) + jiffies; |
|---|
| 353 | 346 | |
|---|
| 354 | 347 | while (1) { |
|---|
| 355 | 348 | doorbell_register = |
|---|
| .. | .. |
|---|
| 421 | 414 | return readl(&ctrl_info->registers->sis_driver_scratch); |
|---|
| 422 | 415 | } |
|---|
| 423 | 416 | |
|---|
| 417 | +void sis_soft_reset(struct pqi_ctrl_info *ctrl_info) |
|---|
| 418 | +{ |
|---|
| 419 | + writel(SIS_SOFT_RESET, |
|---|
| 420 | + &ctrl_info->registers->sis_host_to_ctrl_doorbell); |
|---|
| 421 | +} |
|---|
| 422 | + |
|---|
| 424 | 423 | static void __attribute__((unused)) verify_structures(void) |
|---|
| 425 | 424 | { |
|---|
| 426 | 425 | BUILD_BUG_ON(offsetof(struct sis_base_struct, |
|---|