| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * SuperTrak EX Series Storage Controller driver for Linux |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2005-2015 Promise Technology Inc. |
|---|
| 5 | 6 | * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or |
|---|
| 7 | | - * modify it under the terms of the GNU General Public License |
|---|
| 8 | | - * as published by the Free Software Foundation; either version |
|---|
| 9 | | - * 2 of the License, or (at your option) any later version. |
|---|
| 10 | | - * |
|---|
| 11 | 7 | * Written By: |
|---|
| 12 | 8 | * Ed Lin <promise_linux@promise.com> |
|---|
| 13 | | - * |
|---|
| 14 | 9 | */ |
|---|
| 15 | 10 | |
|---|
| 16 | 11 | #include <linux/init.h> |
|---|
| .. | .. |
|---|
| 114 | 109 | TASK_ATTRIBUTE_HEADOFQUEUE = 0x1, |
|---|
| 115 | 110 | TASK_ATTRIBUTE_ORDERED = 0x2, |
|---|
| 116 | 111 | TASK_ATTRIBUTE_ACA = 0x4, |
|---|
| 112 | +}; |
|---|
| 117 | 113 | |
|---|
| 114 | +enum { |
|---|
| 118 | 115 | SS_STS_NORMAL = 0x80000000, |
|---|
| 119 | 116 | SS_STS_DONE = 0x40000000, |
|---|
| 120 | 117 | SS_STS_HANDSHAKE = 0x20000000, |
|---|
| .. | .. |
|---|
| 126 | 123 | SS_I2H_REQUEST_RESET = 0x2000, |
|---|
| 127 | 124 | |
|---|
| 128 | 125 | SS_MU_OPERATIONAL = 0x80000000, |
|---|
| 126 | +}; |
|---|
| 129 | 127 | |
|---|
| 128 | +enum { |
|---|
| 130 | 129 | STEX_CDB_LENGTH = 16, |
|---|
| 131 | 130 | STATUS_VAR_LEN = 128, |
|---|
| 132 | 131 | |
|---|
| .. | .. |
|---|
| 241 | 240 | u8 data_dir; |
|---|
| 242 | 241 | u8 payload_sz; /* payload size in 4-byte, not used */ |
|---|
| 243 | 242 | u8 cdb[STEX_CDB_LENGTH]; |
|---|
| 244 | | - u32 variable[0]; |
|---|
| 243 | + u32 variable[]; |
|---|
| 245 | 244 | }; |
|---|
| 246 | 245 | |
|---|
| 247 | 246 | struct status_msg { |
|---|
| .. | .. |
|---|
| 673 | 672 | return 0; |
|---|
| 674 | 673 | case PASSTHRU_CMD: |
|---|
| 675 | 674 | if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) { |
|---|
| 676 | | - struct st_drvver ver; |
|---|
| 675 | + const struct st_drvver ver = { |
|---|
| 676 | + .major = ST_VER_MAJOR, |
|---|
| 677 | + .minor = ST_VER_MINOR, |
|---|
| 678 | + .oem = ST_OEM, |
|---|
| 679 | + .build = ST_BUILD_VER, |
|---|
| 680 | + .signature[0] = PASSTHRU_SIGNATURE, |
|---|
| 681 | + .console_id = host->max_id - 1, |
|---|
| 682 | + .host_no = hba->host->host_no, |
|---|
| 683 | + }; |
|---|
| 677 | 684 | size_t cp_len = sizeof(ver); |
|---|
| 678 | 685 | |
|---|
| 679 | | - ver.major = ST_VER_MAJOR; |
|---|
| 680 | | - ver.minor = ST_VER_MINOR; |
|---|
| 681 | | - ver.oem = ST_OEM; |
|---|
| 682 | | - ver.build = ST_BUILD_VER; |
|---|
| 683 | | - ver.signature[0] = PASSTHRU_SIGNATURE; |
|---|
| 684 | | - ver.console_id = host->max_id - 1; |
|---|
| 685 | | - ver.host_no = hba->host->host_no; |
|---|
| 686 | 686 | cp_len = scsi_sg_copy_from_buffer(cmd, &ver, cp_len); |
|---|
| 687 | 687 | cmd->result = sizeof(ver) == cp_len ? |
|---|
| 688 | 688 | DID_OK << 16 | COMMAND_COMPLETE << 8 : |
|---|
| .. | .. |
|---|
| 1489 | 1489 | .eh_abort_handler = stex_abort, |
|---|
| 1490 | 1490 | .eh_host_reset_handler = stex_reset, |
|---|
| 1491 | 1491 | .this_id = -1, |
|---|
| 1492 | + .dma_boundary = PAGE_SIZE - 1, |
|---|
| 1492 | 1493 | }; |
|---|
| 1493 | 1494 | |
|---|
| 1494 | 1495 | static struct pci_device_id stex_pci_tbl[] = { |
|---|
| .. | .. |
|---|
| 1617 | 1618 | }, |
|---|
| 1618 | 1619 | }; |
|---|
| 1619 | 1620 | |
|---|
| 1620 | | -static int stex_set_dma_mask(struct pci_dev * pdev) |
|---|
| 1621 | | -{ |
|---|
| 1622 | | - int ret; |
|---|
| 1623 | | - |
|---|
| 1624 | | - if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) |
|---|
| 1625 | | - && !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) |
|---|
| 1626 | | - return 0; |
|---|
| 1627 | | - ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
|---|
| 1628 | | - if (!ret) |
|---|
| 1629 | | - ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); |
|---|
| 1630 | | - return ret; |
|---|
| 1631 | | -} |
|---|
| 1632 | | - |
|---|
| 1633 | 1621 | static int stex_request_irq(struct st_hba *hba) |
|---|
| 1634 | 1622 | { |
|---|
| 1635 | 1623 | struct pci_dev *pdev = hba->pdev; |
|---|
| .. | .. |
|---|
| 1710 | 1698 | goto out_release_regions; |
|---|
| 1711 | 1699 | } |
|---|
| 1712 | 1700 | |
|---|
| 1713 | | - err = stex_set_dma_mask(pdev); |
|---|
| 1701 | + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); |
|---|
| 1702 | + if (err) |
|---|
| 1703 | + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 1714 | 1704 | if (err) { |
|---|
| 1715 | 1705 | printk(KERN_ERR DRV_NAME "(%s): set dma mask failed\n", |
|---|
| 1716 | 1706 | pci_name(pdev)); |
|---|