^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Adaptec AAC series RAID controller driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * based on the old aacraid driver that is..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Adaptec aacraid device driver for Linux.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (c) 2000-2010 Adaptec, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Module Name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * nark.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Abstract: Hardware Device Interface for NEMER/ARK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "aacraid.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * aac_nark_ioremap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * @dev: device to ioremap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * @size: mapping resize request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static int aac_nark_ioremap(struct aac_dev * dev, u32 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (!size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) iounmap(dev->regs.rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) dev->regs.rx = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) iounmap(dev->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) dev->base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) dev->base_start = pci_resource_start(dev->pdev, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) dev->regs.rx = ioremap((u64)pci_resource_start(dev->pdev, 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ((u64)pci_resource_start(dev->pdev, 1) << 32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) sizeof(struct rx_registers) - sizeof(struct rx_inbound));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) dev->base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) if (dev->regs.rx == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) dev->base = ioremap(dev->base_start, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if (dev->base == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) iounmap(dev->regs.rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) dev->regs.rx = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) dev->IndexRegs = &((struct rx_registers __iomem *)dev->base)->IndexRegs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * aac_nark_init - initialize an NEMER/ARK Split Bar card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * @dev: device to configure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int aac_nark_init(struct aac_dev * dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * Fill in the function dispatch table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) dev->a_ops.adapter_ioremap = aac_nark_ioremap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) dev->a_ops.adapter_comm = aac_rx_select_comm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return _aac_rx_init(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }