// SPDX-License-Identifier: GPL-2.0-or-later /* * Adaptec AAC series RAID controller driver * (c) Copyright 2001 Red Hat Inc. * * based on the old aacraid driver that is.. * Adaptec aacraid device driver for Linux. * * Copyright (c) 2000-2010 Adaptec, Inc. * 2010-2015 PMC-Sierra, Inc. ([email protected]) * 2016-2017 Microsemi Corp. ([email protected]) * * Module Name: * src.c * * Abstract: Hardware Device Interface for PMC SRC based controllers */ #include <linux/kernel.h> #include <linux/init.h> #include <linux/types.h> #include <linux/pci.h> #include <linux/spinlock.h> #include <linux/slab.h> #include <linux/blkdev.h> #include <linux/delay.h> #include <linux/completion.h> #include <linux/time.h> #include <linux/interrupt.h> #include <scsi/scsi_host.h> #include "aacraid.h" static int aac_src_get_sync_status(struct aac_dev *dev); static irqreturn_t aac_src_intr_message(int irq, void *dev_id) { … } /** * aac_src_disable_interrupt - Disable interrupts * @dev: Adapter */ static void aac_src_disable_interrupt(struct aac_dev *dev) { … } /** * aac_src_enable_interrupt_message - Enable interrupts * @dev: Adapter */ static void aac_src_enable_interrupt_message(struct aac_dev *dev) { … } /** * src_sync_cmd - send a command and wait * @dev: Adapter * @command: Command to execute * @p1: first parameter * @p2: second parameter * @p3: third parameter * @p4: forth parameter * @p5: fifth parameter * @p6: sixth parameter * @status: adapter status * @r1: first return value * @r2: second return valu * @r3: third return value * @r4: forth return value * * This routine will send a synchronous command to the adapter and wait * for its completion. */ static int src_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4) { … } /** * aac_src_interrupt_adapter - interrupt adapter * @dev: Adapter * * Send an interrupt to the i960 and breakpoint it. */ static void aac_src_interrupt_adapter(struct aac_dev *dev) { … } /** * aac_src_notify_adapter - send an event to the adapter * @dev: Adapter * @event: Event to send * * Notify the i960 that something it probably cares about has * happened. */ static void aac_src_notify_adapter(struct aac_dev *dev, u32 event) { … } /** * aac_src_start_adapter - activate adapter * @dev: Adapter * * Start up processing on an i960 based AAC adapter */ static void aac_src_start_adapter(struct aac_dev *dev) { … } /** * aac_src_check_health * @dev: device to check if healthy * * Will attempt to determine if the specified adapter is alive and * capable of handling requests, returning 0 if alive. */ static int aac_src_check_health(struct aac_dev *dev) { … } static inline u32 aac_get_vector(struct aac_dev *dev) { … } /** * aac_src_deliver_message * @fib: fib to issue * * Will send a fib, returning 0 if successful. */ static int aac_src_deliver_message(struct fib *fib) { … } /** * aac_src_ioremap * @dev: device ioremap * @size: mapping resize request * */ static int aac_src_ioremap(struct aac_dev *dev, u32 size) { … } /** * aac_srcv_ioremap * @dev: device ioremap * @size: mapping resize request * */ static int aac_srcv_ioremap(struct aac_dev *dev, u32 size) { … } void aac_set_intx_mode(struct aac_dev *dev) { … } static void aac_clear_omr(struct aac_dev *dev) { … } static void aac_dump_fw_fib_iop_reset(struct aac_dev *dev) { … } static bool aac_is_ctrl_up_and_running(struct aac_dev *dev) { … } static void aac_src_drop_io(struct aac_dev *dev) { … } static void aac_notify_fw_of_iop_reset(struct aac_dev *dev) { … } static void aac_send_iop_reset(struct aac_dev *dev) { … } static void aac_send_hardware_soft_reset(struct aac_dev *dev) { … } static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type) { … } /** * aac_src_select_comm - Select communications method * @dev: Adapter * @comm: communications method */ static int aac_src_select_comm(struct aac_dev *dev, int comm) { … } /** * aac_src_init - initialize an Cardinal Frey Bar card * @dev: device to configure * */ int aac_src_init(struct aac_dev *dev) { … } static int aac_src_wait_sync(struct aac_dev *dev, int *status) { … } /** * aac_src_soft_reset - perform soft reset to speed up * access * * Assumptions: That the controller is in a state where we can * bring it back to life with an init struct. We can only use * fast sync commands, as the timeout is 5 seconds. * * @dev: device to configure * */ static int aac_src_soft_reset(struct aac_dev *dev) { … } /** * aac_srcv_init - initialize an SRCv card * @dev: device to configure * */ int aac_srcv_init(struct aac_dev *dev) { … } void aac_src_access_devreg(struct aac_dev *dev, int mode) { … } static int aac_src_get_sync_status(struct aac_dev *dev) { … }