| .. | .. |
|---|
| 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> |
|---|
| .. | .. |
|---|
| 241 | 236 | u8 data_dir; |
|---|
| 242 | 237 | u8 payload_sz; /* payload size in 4-byte, not used */ |
|---|
| 243 | 238 | u8 cdb[STEX_CDB_LENGTH]; |
|---|
| 244 | | - u32 variable[0]; |
|---|
| 239 | + u32 variable[]; |
|---|
| 245 | 240 | }; |
|---|
| 246 | 241 | |
|---|
| 247 | 242 | struct status_msg { |
|---|
| .. | .. |
|---|
| 673 | 668 | return 0; |
|---|
| 674 | 669 | case PASSTHRU_CMD: |
|---|
| 675 | 670 | if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) { |
|---|
| 676 | | - struct st_drvver ver; |
|---|
| 671 | + const struct st_drvver ver = { |
|---|
| 672 | + .major = ST_VER_MAJOR, |
|---|
| 673 | + .minor = ST_VER_MINOR, |
|---|
| 674 | + .oem = ST_OEM, |
|---|
| 675 | + .build = ST_BUILD_VER, |
|---|
| 676 | + .signature[0] = PASSTHRU_SIGNATURE, |
|---|
| 677 | + .console_id = host->max_id - 1, |
|---|
| 678 | + .host_no = hba->host->host_no, |
|---|
| 679 | + }; |
|---|
| 677 | 680 | size_t cp_len = sizeof(ver); |
|---|
| 678 | 681 | |
|---|
| 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 | 682 | cp_len = scsi_sg_copy_from_buffer(cmd, &ver, cp_len); |
|---|
| 687 | 683 | cmd->result = sizeof(ver) == cp_len ? |
|---|
| 688 | 684 | DID_OK << 16 | COMMAND_COMPLETE << 8 : |
|---|
| .. | .. |
|---|
| 1489 | 1485 | .eh_abort_handler = stex_abort, |
|---|
| 1490 | 1486 | .eh_host_reset_handler = stex_reset, |
|---|
| 1491 | 1487 | .this_id = -1, |
|---|
| 1488 | + .dma_boundary = PAGE_SIZE - 1, |
|---|
| 1492 | 1489 | }; |
|---|
| 1493 | 1490 | |
|---|
| 1494 | 1491 | static struct pci_device_id stex_pci_tbl[] = { |
|---|
| .. | .. |
|---|
| 1617 | 1614 | }, |
|---|
| 1618 | 1615 | }; |
|---|
| 1619 | 1616 | |
|---|
| 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 | 1617 | static int stex_request_irq(struct st_hba *hba) |
|---|
| 1634 | 1618 | { |
|---|
| 1635 | 1619 | struct pci_dev *pdev = hba->pdev; |
|---|
| .. | .. |
|---|
| 1710 | 1694 | goto out_release_regions; |
|---|
| 1711 | 1695 | } |
|---|
| 1712 | 1696 | |
|---|
| 1713 | | - err = stex_set_dma_mask(pdev); |
|---|
| 1697 | + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); |
|---|
| 1698 | + if (err) |
|---|
| 1699 | + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 1714 | 1700 | if (err) { |
|---|
| 1715 | 1701 | printk(KERN_ERR DRV_NAME "(%s): set dma mask failed\n", |
|---|
| 1716 | 1702 | pci_name(pdev)); |
|---|