Commit 9abb593e authored by Martin K. Petersen's avatar Martin K. Petersen
Browse files

Merge patch series "arcmsr fixes"

Ching Huang <ching2048@areca.com.tw> says:

The following patches were made over mkp's 6.4/scsi-staging

This series comtain some fixes:

 - Deprecate arcmsr_pci_unmap_dma()

 - Fix ADAPTER_TYPE_B 64-bit DMA compatibility issue

 - Fix reading buffer empty length error

 - Add driver proc_name

 - Update driver's version to v1.50.00.13-20230206

Link: https://lore.kernel.org/r/6f3eb04dbe89d2b9f239600dd2c575227f3c0afc.camel@areca.com.tw


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parents c45b3804 8d4cce50
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -45,11 +45,12 @@
#include <linux/interrupt.h>
struct device_attribute;
/*The limit of outstanding scsi command that firmware can handle*/
#define ARCMSR_NAME			"arcmsr"
#define ARCMSR_MAX_FREECCB_NUM		1024
#define ARCMSR_MAX_OUTSTANDING_CMD	1024
#define ARCMSR_DEFAULT_OUTSTANDING_CMD	128
#define ARCMSR_MIN_OUTSTANDING_CMD	32
#define ARCMSR_DRIVER_VERSION		"v1.50.00.05-20210429"
#define ARCMSR_DRIVER_VERSION		"v1.50.00.13-20230206"
#define ARCMSR_SCSI_INITIATOR_ID	255
#define ARCMSR_MAX_XFER_SECTORS		512
#define ARCMSR_MAX_XFER_SECTORS_B	4096
+10 −11
Original line number Diff line number Diff line
@@ -153,6 +153,7 @@ static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int queue_de

static struct scsi_host_template arcmsr_scsi_host_template = {
	.module			= THIS_MODULE,
	.proc_name		= ARCMSR_NAME,
	.name			= "Areca SAS/SATA RAID driver",
	.info			= arcmsr_info,
	.queuecommand		= arcmsr_queue_command,
@@ -996,6 +997,8 @@ static int arcmsr_set_dma_mask(struct AdapterControlBlock *acb)
		if (((acb->adapter_type == ACB_ADAPTER_TYPE_A) && !dma_mask_64) ||
		    dma_set_mask(&pcidev->dev, DMA_BIT_MASK(64)))
			goto	dma32;
		if (acb->adapter_type <= ACB_ADAPTER_TYPE_B)
			return 0;
		if (dma_set_coherent_mask(&pcidev->dev, DMA_BIT_MASK(64)) ||
		    dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(64))) {
			printk("arcmsr: set DMA 64 mask failed\n");
@@ -1299,20 +1302,13 @@ static uint8_t arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
	return rtnval;
}

static void arcmsr_pci_unmap_dma(struct CommandControlBlock *ccb)
{
	struct scsi_cmnd *pcmd = ccb->pcmd;

	scsi_dma_unmap(pcmd);
}

static void arcmsr_ccb_complete(struct CommandControlBlock *ccb)
{
	struct AdapterControlBlock *acb = ccb->acb;
	struct scsi_cmnd *pcmd = ccb->pcmd;
	unsigned long flags;
	atomic_dec(&acb->ccboutstandingcount);
	arcmsr_pci_unmap_dma(ccb);
	scsi_dma_unmap(ccb->pcmd);
	ccb->startdone = ARCMSR_CCB_DONE;
	spin_lock_irqsave(&acb->ccblist_lock, flags);
	list_add_tail(&ccb->list, &acb->ccb_free_list);
@@ -1596,7 +1592,7 @@ static void arcmsr_remove_scsi_devices(struct AdapterControlBlock *acb)
		ccb = acb->pccb_pool[i];
		if (ccb->startdone == ARCMSR_CCB_START) {
			ccb->pcmd->result = DID_NO_CONNECT << 16;
			arcmsr_pci_unmap_dma(ccb);
			scsi_dma_unmap(ccb->pcmd);
			scsi_done(ccb->pcmd);
		}
	}
@@ -2259,8 +2255,11 @@ static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)

	spin_lock_irqsave(&acb->rqbuffer_lock, flags);
	prbuffer = arcmsr_get_iop_rqbuffer(acb);
	buf_empty_len = (acb->rqbuf_putIndex - acb->rqbuf_getIndex - 1) &
		(ARCMSR_MAX_QBUFFER - 1);
	if (acb->rqbuf_putIndex >= acb->rqbuf_getIndex) {
		buf_empty_len = (ARCMSR_MAX_QBUFFER - 1) -
		(acb->rqbuf_putIndex - acb->rqbuf_getIndex);
	} else
		buf_empty_len = acb->rqbuf_getIndex - acb->rqbuf_putIndex - 1;
	if (buf_empty_len >= readl(&prbuffer->data_len)) {
		if (arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
			acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;