merge by hand - fix up rejections in Documentation/DocBook/Makefile
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
|
||||
|
||||
Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
|
||||
Portions Copyright 2002 by Mylex (An IBM Business Unit)
|
||||
|
||||
This program is free software; you may redistribute and/or modify it under
|
||||
the terms of the GNU General Public License Version 2 as published by the
|
||||
@@ -532,6 +533,34 @@ static void DAC960_WaitForCommand(DAC960_Controller_T *Controller)
|
||||
spin_lock_irq(&Controller->queue_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
DAC960_GEM_QueueCommand queues Command for DAC960 GEM Series Controllers.
|
||||
*/
|
||||
|
||||
static void DAC960_GEM_QueueCommand(DAC960_Command_T *Command)
|
||||
{
|
||||
DAC960_Controller_T *Controller = Command->Controller;
|
||||
void __iomem *ControllerBaseAddress = Controller->BaseAddress;
|
||||
DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
|
||||
DAC960_V2_CommandMailbox_T *NextCommandMailbox =
|
||||
Controller->V2.NextCommandMailbox;
|
||||
|
||||
CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
|
||||
DAC960_GEM_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
|
||||
|
||||
if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
|
||||
Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
|
||||
DAC960_GEM_MemoryMailboxNewCommand(ControllerBaseAddress);
|
||||
|
||||
Controller->V2.PreviousCommandMailbox2 =
|
||||
Controller->V2.PreviousCommandMailbox1;
|
||||
Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
|
||||
|
||||
if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
|
||||
NextCommandMailbox = Controller->V2.FirstCommandMailbox;
|
||||
|
||||
Controller->V2.NextCommandMailbox = NextCommandMailbox;
|
||||
}
|
||||
|
||||
/*
|
||||
DAC960_BA_QueueCommand queues Command for DAC960 BA Series Controllers.
|
||||
@@ -1464,6 +1493,17 @@ static boolean DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
|
||||
Controller->V2.FirstStatusMailboxDMA;
|
||||
switch (Controller->HardwareType)
|
||||
{
|
||||
case DAC960_GEM_Controller:
|
||||
while (DAC960_GEM_HardwareMailboxFullP(ControllerBaseAddress))
|
||||
udelay(1);
|
||||
DAC960_GEM_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
|
||||
DAC960_GEM_HardwareMailboxNewCommand(ControllerBaseAddress);
|
||||
while (!DAC960_GEM_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
|
||||
udelay(1);
|
||||
CommandStatus = DAC960_GEM_ReadCommandStatus(ControllerBaseAddress);
|
||||
DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
|
||||
DAC960_GEM_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
|
||||
break;
|
||||
case DAC960_BA_Controller:
|
||||
while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress))
|
||||
udelay(1);
|
||||
@@ -2627,6 +2667,9 @@ static void DAC960_DetectCleanup(DAC960_Controller_T *Controller)
|
||||
if (Controller->MemoryMappedAddress) {
|
||||
switch(Controller->HardwareType)
|
||||
{
|
||||
case DAC960_GEM_Controller:
|
||||
DAC960_GEM_DisableInterrupts(Controller->BaseAddress);
|
||||
break;
|
||||
case DAC960_BA_Controller:
|
||||
DAC960_BA_DisableInterrupts(Controller->BaseAddress);
|
||||
break;
|
||||
@@ -2705,6 +2748,9 @@ DAC960_DetectController(struct pci_dev *PCI_Device,
|
||||
|
||||
switch (Controller->HardwareType)
|
||||
{
|
||||
case DAC960_GEM_Controller:
|
||||
Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
|
||||
break;
|
||||
case DAC960_BA_Controller:
|
||||
Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
|
||||
break;
|
||||
@@ -2756,6 +2802,36 @@ DAC960_DetectController(struct pci_dev *PCI_Device,
|
||||
BaseAddress = Controller->BaseAddress;
|
||||
switch (Controller->HardwareType)
|
||||
{
|
||||
case DAC960_GEM_Controller:
|
||||
DAC960_GEM_DisableInterrupts(BaseAddress);
|
||||
DAC960_GEM_AcknowledgeHardwareMailboxStatus(BaseAddress);
|
||||
udelay(1000);
|
||||
while (DAC960_GEM_InitializationInProgressP(BaseAddress))
|
||||
{
|
||||
if (DAC960_GEM_ReadErrorStatus(BaseAddress, &ErrorStatus,
|
||||
&Parameter0, &Parameter1) &&
|
||||
DAC960_ReportErrorStatus(Controller, ErrorStatus,
|
||||
Parameter0, Parameter1))
|
||||
goto Failure;
|
||||
udelay(10);
|
||||
}
|
||||
if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
|
||||
{
|
||||
DAC960_Error("Unable to Enable Memory Mailbox Interface "
|
||||
"for Controller at\n", Controller);
|
||||
goto Failure;
|
||||
}
|
||||
DAC960_GEM_EnableInterrupts(BaseAddress);
|
||||
Controller->QueueCommand = DAC960_GEM_QueueCommand;
|
||||
Controller->ReadControllerConfiguration =
|
||||
DAC960_V2_ReadControllerConfiguration;
|
||||
Controller->ReadDeviceConfiguration =
|
||||
DAC960_V2_ReadDeviceConfiguration;
|
||||
Controller->ReportDeviceConfiguration =
|
||||
DAC960_V2_ReportDeviceConfiguration;
|
||||
Controller->QueueReadWriteCommand =
|
||||
DAC960_V2_QueueReadWriteCommand;
|
||||
break;
|
||||
case DAC960_BA_Controller:
|
||||
DAC960_BA_DisableInterrupts(BaseAddress);
|
||||
DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress);
|
||||
@@ -5189,6 +5265,47 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
|
||||
wake_up(&Controller->CommandWaitQueue);
|
||||
}
|
||||
|
||||
/*
|
||||
DAC960_GEM_InterruptHandler handles hardware interrupts from DAC960 GEM Series
|
||||
Controllers.
|
||||
*/
|
||||
|
||||
static irqreturn_t DAC960_GEM_InterruptHandler(int IRQ_Channel,
|
||||
void *DeviceIdentifier,
|
||||
struct pt_regs *InterruptRegisters)
|
||||
{
|
||||
DAC960_Controller_T *Controller = (DAC960_Controller_T *) DeviceIdentifier;
|
||||
void __iomem *ControllerBaseAddress = Controller->BaseAddress;
|
||||
DAC960_V2_StatusMailbox_T *NextStatusMailbox;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&Controller->queue_lock, flags);
|
||||
DAC960_GEM_AcknowledgeInterrupt(ControllerBaseAddress);
|
||||
NextStatusMailbox = Controller->V2.NextStatusMailbox;
|
||||
while (NextStatusMailbox->Fields.CommandIdentifier > 0)
|
||||
{
|
||||
DAC960_V2_CommandIdentifier_T CommandIdentifier =
|
||||
NextStatusMailbox->Fields.CommandIdentifier;
|
||||
DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
|
||||
Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
|
||||
Command->V2.RequestSenseLength =
|
||||
NextStatusMailbox->Fields.RequestSenseLength;
|
||||
Command->V2.DataTransferResidue =
|
||||
NextStatusMailbox->Fields.DataTransferResidue;
|
||||
NextStatusMailbox->Words[0] = 0;
|
||||
if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
|
||||
NextStatusMailbox = Controller->V2.FirstStatusMailbox;
|
||||
DAC960_V2_ProcessCompletedCommand(Command);
|
||||
}
|
||||
Controller->V2.NextStatusMailbox = NextStatusMailbox;
|
||||
/*
|
||||
Attempt to remove additional I/O Requests from the Controller's
|
||||
I/O Request Queue and queue them to the Controller.
|
||||
*/
|
||||
DAC960_ProcessRequest(Controller);
|
||||
spin_unlock_irqrestore(&Controller->queue_lock, flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
DAC960_BA_InterruptHandler handles hardware interrupts from DAC960 BA Series
|
||||
@@ -6962,6 +7079,14 @@ static void DAC960_gam_cleanup(void)
|
||||
|
||||
#endif /* DAC960_GAM_MINOR */
|
||||
|
||||
static struct DAC960_privdata DAC960_GEM_privdata = {
|
||||
.HardwareType = DAC960_GEM_Controller,
|
||||
.FirmwareType = DAC960_V2_Controller,
|
||||
.InterruptHandler = DAC960_GEM_InterruptHandler,
|
||||
.MemoryWindowSize = DAC960_GEM_RegisterWindowSize,
|
||||
};
|
||||
|
||||
|
||||
static struct DAC960_privdata DAC960_BA_privdata = {
|
||||
.HardwareType = DAC960_BA_Controller,
|
||||
.FirmwareType = DAC960_V2_Controller,
|
||||
@@ -7005,6 +7130,13 @@ static struct DAC960_privdata DAC960_P_privdata = {
|
||||
};
|
||||
|
||||
static struct pci_device_id DAC960_id_table[] = {
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_MYLEX,
|
||||
.device = PCI_DEVICE_ID_MYLEX_DAC960_GEM,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.driver_data = (unsigned long) &DAC960_GEM_privdata,
|
||||
},
|
||||
{
|
||||
.vendor = PCI_VENDOR_ID_MYLEX,
|
||||
.device = PCI_DEVICE_ID_MYLEX_DAC960_BA,
|
||||
|
||||
+316
-1
@@ -2114,7 +2114,8 @@ typedef enum
|
||||
DAC960_LA_Controller = 3, /* DAC1164P */
|
||||
DAC960_PG_Controller = 4, /* DAC960PTL/PJ/PG */
|
||||
DAC960_PD_Controller = 5, /* DAC960PU/PD/PL/P */
|
||||
DAC960_P_Controller = 6 /* DAC960PU/PD/PL/P */
|
||||
DAC960_P_Controller = 6, /* DAC960PU/PD/PL/P */
|
||||
DAC960_GEM_Controller = 7, /* AcceleRAID 4/5/600 */
|
||||
}
|
||||
DAC960_HardwareType_T;
|
||||
|
||||
@@ -2540,6 +2541,320 @@ void dma_addr_writeql(dma_addr_t addr, void __iomem *write_address)
|
||||
writel(u.wl[1], write_address + 4);
|
||||
}
|
||||
|
||||
/*
|
||||
Define the DAC960 GEM Series Controller Interface Register Offsets.
|
||||
*/
|
||||
|
||||
#define DAC960_GEM_RegisterWindowSize 0x600
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegisterReadSetOffset = 0x214,
|
||||
DAC960_GEM_InboundDoorBellRegisterClearOffset = 0x218,
|
||||
DAC960_GEM_OutboundDoorBellRegisterReadSetOffset = 0x224,
|
||||
DAC960_GEM_OutboundDoorBellRegisterClearOffset = 0x228,
|
||||
DAC960_GEM_InterruptStatusRegisterOffset = 0x208,
|
||||
DAC960_GEM_InterruptMaskRegisterReadSetOffset = 0x22C,
|
||||
DAC960_GEM_InterruptMaskRegisterClearOffset = 0x230,
|
||||
DAC960_GEM_CommandMailboxBusAddressOffset = 0x510,
|
||||
DAC960_GEM_CommandStatusOffset = 0x518,
|
||||
DAC960_GEM_ErrorStatusRegisterReadSetOffset = 0x224,
|
||||
DAC960_GEM_ErrorStatusRegisterClearOffset = 0x228,
|
||||
}
|
||||
DAC960_GEM_RegisterOffsets_T;
|
||||
|
||||
/*
|
||||
Define the structure of the DAC960 GEM Series Inbound Door Bell
|
||||
*/
|
||||
|
||||
typedef union DAC960_GEM_InboundDoorBellRegister
|
||||
{
|
||||
unsigned int All;
|
||||
struct {
|
||||
unsigned int :24;
|
||||
boolean HardwareMailboxNewCommand:1;
|
||||
boolean AcknowledgeHardwareMailboxStatus:1;
|
||||
boolean GenerateInterrupt:1;
|
||||
boolean ControllerReset:1;
|
||||
boolean MemoryMailboxNewCommand:1;
|
||||
unsigned int :3;
|
||||
} Write;
|
||||
struct {
|
||||
unsigned int :24;
|
||||
boolean HardwareMailboxFull:1;
|
||||
boolean InitializationInProgress:1;
|
||||
unsigned int :6;
|
||||
} Read;
|
||||
}
|
||||
DAC960_GEM_InboundDoorBellRegister_T;
|
||||
|
||||
/*
|
||||
Define the structure of the DAC960 GEM Series Outbound Door Bell Register.
|
||||
*/
|
||||
typedef union DAC960_GEM_OutboundDoorBellRegister
|
||||
{
|
||||
unsigned int All;
|
||||
struct {
|
||||
unsigned int :24;
|
||||
boolean AcknowledgeHardwareMailboxInterrupt:1;
|
||||
boolean AcknowledgeMemoryMailboxInterrupt:1;
|
||||
unsigned int :6;
|
||||
} Write;
|
||||
struct {
|
||||
unsigned int :24;
|
||||
boolean HardwareMailboxStatusAvailable:1;
|
||||
boolean MemoryMailboxStatusAvailable:1;
|
||||
unsigned int :6;
|
||||
} Read;
|
||||
}
|
||||
DAC960_GEM_OutboundDoorBellRegister_T;
|
||||
|
||||
/*
|
||||
Define the structure of the DAC960 GEM Series Interrupt Mask Register.
|
||||
*/
|
||||
typedef union DAC960_GEM_InterruptMaskRegister
|
||||
{
|
||||
unsigned int All;
|
||||
struct {
|
||||
unsigned int :16;
|
||||
unsigned int :8;
|
||||
unsigned int HardwareMailboxInterrupt:1;
|
||||
unsigned int MemoryMailboxInterrupt:1;
|
||||
unsigned int :6;
|
||||
} Bits;
|
||||
}
|
||||
DAC960_GEM_InterruptMaskRegister_T;
|
||||
|
||||
/*
|
||||
Define the structure of the DAC960 GEM Series Error Status Register.
|
||||
*/
|
||||
|
||||
typedef union DAC960_GEM_ErrorStatusRegister
|
||||
{
|
||||
unsigned int All;
|
||||
struct {
|
||||
unsigned int :24;
|
||||
unsigned int :5;
|
||||
boolean ErrorStatusPending:1;
|
||||
unsigned int :2;
|
||||
} Bits;
|
||||
}
|
||||
DAC960_GEM_ErrorStatusRegister_T;
|
||||
|
||||
/*
|
||||
Define inline functions to provide an abstraction for reading and writing the
|
||||
DAC960 GEM Series Controller Interface Registers.
|
||||
*/
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_HardwareMailboxNewCommand(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All = 0;
|
||||
InboundDoorBellRegister.Write.HardwareMailboxNewCommand = true;
|
||||
writel(InboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_AcknowledgeHardwareMailboxStatus(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All = 0;
|
||||
InboundDoorBellRegister.Write.AcknowledgeHardwareMailboxStatus = true;
|
||||
writel(InboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterClearOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_GenerateInterrupt(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All = 0;
|
||||
InboundDoorBellRegister.Write.GenerateInterrupt = true;
|
||||
writel(InboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_ControllerReset(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All = 0;
|
||||
InboundDoorBellRegister.Write.ControllerReset = true;
|
||||
writel(InboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All = 0;
|
||||
InboundDoorBellRegister.Write.MemoryMailboxNewCommand = true;
|
||||
writel(InboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
boolean DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All =
|
||||
readl(ControllerBaseAddress +
|
||||
DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
return InboundDoorBellRegister.Read.HardwareMailboxFull;
|
||||
}
|
||||
|
||||
static inline
|
||||
boolean DAC960_GEM_InitializationInProgressP(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
|
||||
InboundDoorBellRegister.All =
|
||||
readl(ControllerBaseAddress +
|
||||
DAC960_GEM_InboundDoorBellRegisterReadSetOffset);
|
||||
return InboundDoorBellRegister.Read.InitializationInProgress;
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
|
||||
OutboundDoorBellRegister.All = 0;
|
||||
OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
|
||||
writel(OutboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_AcknowledgeMemoryMailboxInterrupt(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
|
||||
OutboundDoorBellRegister.All = 0;
|
||||
OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
|
||||
writel(OutboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
|
||||
OutboundDoorBellRegister.All = 0;
|
||||
OutboundDoorBellRegister.Write.AcknowledgeHardwareMailboxInterrupt = true;
|
||||
OutboundDoorBellRegister.Write.AcknowledgeMemoryMailboxInterrupt = true;
|
||||
writel(OutboundDoorBellRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_OutboundDoorBellRegisterClearOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
boolean DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
|
||||
OutboundDoorBellRegister.All =
|
||||
readl(ControllerBaseAddress +
|
||||
DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
|
||||
return OutboundDoorBellRegister.Read.HardwareMailboxStatusAvailable;
|
||||
}
|
||||
|
||||
static inline
|
||||
boolean DAC960_GEM_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
|
||||
OutboundDoorBellRegister.All =
|
||||
readl(ControllerBaseAddress +
|
||||
DAC960_GEM_OutboundDoorBellRegisterReadSetOffset);
|
||||
return OutboundDoorBellRegister.Read.MemoryMailboxStatusAvailable;
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_EnableInterrupts(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
|
||||
InterruptMaskRegister.All = 0;
|
||||
InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
|
||||
InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
|
||||
writel(InterruptMaskRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterClearOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_DisableInterrupts(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
|
||||
InterruptMaskRegister.All = 0;
|
||||
InterruptMaskRegister.Bits.HardwareMailboxInterrupt = true;
|
||||
InterruptMaskRegister.Bits.MemoryMailboxInterrupt = true;
|
||||
writel(InterruptMaskRegister.All,
|
||||
ControllerBaseAddress + DAC960_GEM_InterruptMaskRegisterReadSetOffset);
|
||||
}
|
||||
|
||||
static inline
|
||||
boolean DAC960_GEM_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
|
||||
InterruptMaskRegister.All =
|
||||
readl(ControllerBaseAddress +
|
||||
DAC960_GEM_InterruptMaskRegisterReadSetOffset);
|
||||
return !(InterruptMaskRegister.Bits.HardwareMailboxInterrupt ||
|
||||
InterruptMaskRegister.Bits.MemoryMailboxInterrupt);
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_WriteCommandMailbox(DAC960_V2_CommandMailbox_T
|
||||
*MemoryCommandMailbox,
|
||||
DAC960_V2_CommandMailbox_T
|
||||
*CommandMailbox)
|
||||
{
|
||||
memcpy(&MemoryCommandMailbox->Words[1], &CommandMailbox->Words[1],
|
||||
sizeof(DAC960_V2_CommandMailbox_T) - sizeof(unsigned int));
|
||||
wmb();
|
||||
MemoryCommandMailbox->Words[0] = CommandMailbox->Words[0];
|
||||
mb();
|
||||
}
|
||||
|
||||
static inline
|
||||
void DAC960_GEM_WriteHardwareMailbox(void __iomem *ControllerBaseAddress,
|
||||
dma_addr_t CommandMailboxDMA)
|
||||
{
|
||||
dma_addr_writeql(CommandMailboxDMA,
|
||||
ControllerBaseAddress +
|
||||
DAC960_GEM_CommandMailboxBusAddressOffset);
|
||||
}
|
||||
|
||||
static inline DAC960_V2_CommandIdentifier_T
|
||||
DAC960_GEM_ReadCommandIdentifier(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset);
|
||||
}
|
||||
|
||||
static inline DAC960_V2_CommandStatus_T
|
||||
DAC960_GEM_ReadCommandStatus(void __iomem *ControllerBaseAddress)
|
||||
{
|
||||
return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset + 2);
|
||||
}
|
||||
|
||||
static inline boolean
|
||||
DAC960_GEM_ReadErrorStatus(void __iomem *ControllerBaseAddress,
|
||||
unsigned char *ErrorStatus,
|
||||
unsigned char *Parameter0,
|
||||
unsigned char *Parameter1)
|
||||
{
|
||||
DAC960_GEM_ErrorStatusRegister_T ErrorStatusRegister;
|
||||
ErrorStatusRegister.All =
|
||||
readl(ControllerBaseAddress + DAC960_GEM_ErrorStatusRegisterReadSetOffset);
|
||||
if (!ErrorStatusRegister.Bits.ErrorStatusPending) return false;
|
||||
ErrorStatusRegister.Bits.ErrorStatusPending = false;
|
||||
*ErrorStatus = ErrorStatusRegister.All;
|
||||
*Parameter0 =
|
||||
readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 0);
|
||||
*Parameter1 =
|
||||
readb(ControllerBaseAddress + DAC960_GEM_CommandMailboxBusAddressOffset + 1);
|
||||
writel(0x03000000, ControllerBaseAddress +
|
||||
DAC960_GEM_ErrorStatusRegisterClearOffset);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
Define the DAC960 BA Series Controller Interface Register Offsets.
|
||||
*/
|
||||
|
||||
@@ -6,7 +6,7 @@ menu "Block devices"
|
||||
|
||||
config BLK_DEV_FD
|
||||
tristate "Normal floppy disk support"
|
||||
depends on (!ARCH_S390 && !M68K && !IA64 && !UML) || Q40 || (SUN3X && BROKEN) || ARCH_RPC || ARCH_EBSA285
|
||||
depends on (!ARCH_S390 && !M68K && !IA64 && !UML && !ARM) || Q40 || (SUN3X && BROKEN) || ARCH_RPC || ARCH_EBSA285
|
||||
---help---
|
||||
If you want to use the floppy disk drive(s) of your PC under Linux,
|
||||
say Y. Information about this driver, especially important for IBM
|
||||
@@ -105,7 +105,7 @@ config ATARI_SLM
|
||||
|
||||
config BLK_DEV_XD
|
||||
tristate "XT hard disk support"
|
||||
depends on ISA
|
||||
depends on ISA && ISA_DMA_API
|
||||
help
|
||||
Very old 8 bit hard disk controllers used in the IBM XT computer
|
||||
will be supported if you say Y here.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */
|
||||
#define VERSION "6"
|
||||
#define VERSION "10"
|
||||
#define AOE_MAJOR 152
|
||||
#define DEVICE_NAME "aoe"
|
||||
|
||||
|
||||
@@ -37,6 +37,13 @@ static ssize_t aoedisk_show_netif(struct gendisk * disk, char *page)
|
||||
|
||||
return snprintf(page, PAGE_SIZE, "%s\n", d->ifp->name);
|
||||
}
|
||||
/* firmware version */
|
||||
static ssize_t aoedisk_show_fwver(struct gendisk * disk, char *page)
|
||||
{
|
||||
struct aoedev *d = disk->private_data;
|
||||
|
||||
return snprintf(page, PAGE_SIZE, "0x%04x\n", (unsigned int) d->fw_ver);
|
||||
}
|
||||
|
||||
static struct disk_attribute disk_attr_state = {
|
||||
.attr = {.name = "state", .mode = S_IRUGO },
|
||||
@@ -50,6 +57,10 @@ static struct disk_attribute disk_attr_netif = {
|
||||
.attr = {.name = "netif", .mode = S_IRUGO },
|
||||
.show = aoedisk_show_netif
|
||||
};
|
||||
static struct disk_attribute disk_attr_fwver = {
|
||||
.attr = {.name = "firmware-version", .mode = S_IRUGO },
|
||||
.show = aoedisk_show_fwver
|
||||
};
|
||||
|
||||
static void
|
||||
aoedisk_add_sysfs(struct aoedev *d)
|
||||
@@ -57,6 +68,7 @@ aoedisk_add_sysfs(struct aoedev *d)
|
||||
sysfs_create_file(&d->gd->kobj, &disk_attr_state.attr);
|
||||
sysfs_create_file(&d->gd->kobj, &disk_attr_mac.attr);
|
||||
sysfs_create_file(&d->gd->kobj, &disk_attr_netif.attr);
|
||||
sysfs_create_file(&d->gd->kobj, &disk_attr_fwver.attr);
|
||||
}
|
||||
void
|
||||
aoedisk_rm_sysfs(struct aoedev *d)
|
||||
@@ -64,6 +76,7 @@ aoedisk_rm_sysfs(struct aoedev *d)
|
||||
sysfs_remove_link(&d->gd->kobj, "state");
|
||||
sysfs_remove_link(&d->gd->kobj, "mac");
|
||||
sysfs_remove_link(&d->gd->kobj, "netif");
|
||||
sysfs_remove_link(&d->gd->kobj, "firmware-version");
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -109,25 +109,22 @@ aoedev_set(ulong sysminor, unsigned char *addr, struct net_device *ifp, ulong bu
|
||||
spin_lock_irqsave(&devlist_lock, flags);
|
||||
|
||||
for (d=devlist; d; d=d->next)
|
||||
if (d->sysminor == sysminor
|
||||
|| memcmp(d->addr, addr, sizeof d->addr) == 0)
|
||||
if (d->sysminor == sysminor)
|
||||
break;
|
||||
|
||||
if (d == NULL && (d = aoedev_newdev(bufcnt)) == NULL) {
|
||||
spin_unlock_irqrestore(&devlist_lock, flags);
|
||||
printk(KERN_INFO "aoe: aoedev_set: aoedev_newdev failure.\n");
|
||||
return NULL;
|
||||
}
|
||||
} /* if newdev, (d->flags & DEVFL_UP) == 0 for below */
|
||||
|
||||
spin_unlock_irqrestore(&devlist_lock, flags);
|
||||
spin_lock_irqsave(&d->lock, flags);
|
||||
|
||||
d->ifp = ifp;
|
||||
|
||||
if (d->sysminor != sysminor
|
||||
|| (d->flags & DEVFL_UP) == 0) {
|
||||
memcpy(d->addr, addr, sizeof d->addr);
|
||||
if ((d->flags & DEVFL_UP) == 0) {
|
||||
aoedev_downdev(d); /* flushes outstanding frames */
|
||||
memcpy(d->addr, addr, sizeof d->addr);
|
||||
d->sysminor = sysminor;
|
||||
d->aoemajor = AOEMAJOR(sysminor);
|
||||
d->aoeminor = AOEMINOR(sysminor);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include "aoe.h"
|
||||
|
||||
#define NECODES 5
|
||||
@@ -26,6 +27,19 @@ enum {
|
||||
};
|
||||
|
||||
static char aoe_iflist[IFLISTSZ];
|
||||
module_param_string(aoe_iflist, aoe_iflist, IFLISTSZ, 0600);
|
||||
MODULE_PARM_DESC(aoe_iflist, "aoe_iflist=\"dev1 [dev2 ...]\"\n");
|
||||
|
||||
#ifndef MODULE
|
||||
static int __init aoe_iflist_setup(char *str)
|
||||
{
|
||||
strncpy(aoe_iflist, str, IFLISTSZ);
|
||||
aoe_iflist[IFLISTSZ - 1] = '\0';
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("aoe_iflist=", aoe_iflist_setup);
|
||||
#endif
|
||||
|
||||
int
|
||||
is_aoe_netif(struct net_device *ifp)
|
||||
@@ -36,7 +50,8 @@ is_aoe_netif(struct net_device *ifp)
|
||||
if (aoe_iflist[0] == '\0')
|
||||
return 1;
|
||||
|
||||
for (p = aoe_iflist; *p; p = q + strspn(q, WHITESPACE)) {
|
||||
p = aoe_iflist + strspn(aoe_iflist, WHITESPACE);
|
||||
for (; *p; p = q + strspn(q, WHITESPACE)) {
|
||||
q = p + strcspn(p, WHITESPACE);
|
||||
if (q != p)
|
||||
len = q - p;
|
||||
|
||||
@@ -3345,7 +3345,7 @@ static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
|
||||
struct block_device *bdev = opened_bdev[cnt];
|
||||
if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
|
||||
continue;
|
||||
__invalidate_device(bdev, 0);
|
||||
__invalidate_device(bdev);
|
||||
}
|
||||
up(&open_lock);
|
||||
} else {
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/kobj_map.h>
|
||||
#include <linux/buffer_head.h>
|
||||
|
||||
#define MAX_PROBE_HASH 255 /* random */
|
||||
|
||||
@@ -676,7 +677,8 @@ int invalidate_partition(struct gendisk *disk, int index)
|
||||
int res = 0;
|
||||
struct block_device *bdev = bdget_disk(disk, index);
|
||||
if (bdev) {
|
||||
res = __invalidate_device(bdev, 1);
|
||||
fsync_bdev(bdev);
|
||||
res = __invalidate_device(bdev);
|
||||
bdput(bdev);
|
||||
}
|
||||
return res;
|
||||
|
||||
+13
-3
@@ -78,6 +78,7 @@
|
||||
#define DBG_RX 0x0200
|
||||
#define DBG_TX 0x0400
|
||||
static unsigned int debugflags;
|
||||
static unsigned int nbds_max = 16;
|
||||
#endif /* NDEBUG */
|
||||
|
||||
static struct nbd_device nbd_dev[MAX_NBD];
|
||||
@@ -647,7 +648,13 @@ static int __init nbd_init(void)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_NBD; i++) {
|
||||
if (nbds_max > MAX_NBD) {
|
||||
printk(KERN_CRIT "nbd: cannot allocate more than %u nbds; %u requested.\n", MAX_NBD,
|
||||
nbds_max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < nbds_max; i++) {
|
||||
struct gendisk *disk = alloc_disk(1);
|
||||
if (!disk)
|
||||
goto out;
|
||||
@@ -673,7 +680,7 @@ static int __init nbd_init(void)
|
||||
dprintk(DBG_INIT, "nbd: debugflags=0x%x\n", debugflags);
|
||||
|
||||
devfs_mk_dir("nbd");
|
||||
for (i = 0; i < MAX_NBD; i++) {
|
||||
for (i = 0; i < nbds_max; i++) {
|
||||
struct gendisk *disk = nbd_dev[i].disk;
|
||||
nbd_dev[i].file = NULL;
|
||||
nbd_dev[i].magic = LO_MAGIC;
|
||||
@@ -706,8 +713,9 @@ out:
|
||||
static void __exit nbd_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_NBD; i++) {
|
||||
for (i = 0; i < nbds_max; i++) {
|
||||
struct gendisk *disk = nbd_dev[i].disk;
|
||||
nbd_dev[i].magic = 0;
|
||||
if (disk) {
|
||||
del_gendisk(disk);
|
||||
blk_cleanup_queue(disk->queue);
|
||||
@@ -725,6 +733,8 @@ module_exit(nbd_cleanup);
|
||||
MODULE_DESCRIPTION("Network Block Device");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_param(nbds_max, int, 0444);
|
||||
MODULE_PARM_DESC(nbds_max, "How many network block devices to initialize.");
|
||||
#ifndef NDEBUG
|
||||
module_param(debugflags, int, 0644);
|
||||
MODULE_PARM_DESC(debugflags, "flags for controlling debug output");
|
||||
|
||||
@@ -13,34 +13,13 @@
|
||||
static int elevator_noop_merge(request_queue_t *q, struct request **req,
|
||||
struct bio *bio)
|
||||
{
|
||||
struct list_head *entry = &q->queue_head;
|
||||
struct request *__rq;
|
||||
int ret;
|
||||
|
||||
if ((ret = elv_try_last_merge(q, bio))) {
|
||||
ret = elv_try_last_merge(q, bio);
|
||||
if (ret != ELEVATOR_NO_MERGE)
|
||||
*req = q->last_merge;
|
||||
return ret;
|
||||
}
|
||||
|
||||
while ((entry = entry->prev) != &q->queue_head) {
|
||||
__rq = list_entry_rq(entry);
|
||||
|
||||
if (__rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER))
|
||||
break;
|
||||
else if (__rq->flags & REQ_STARTED)
|
||||
break;
|
||||
|
||||
if (!blk_fs_request(__rq))
|
||||
continue;
|
||||
|
||||
if ((ret = elv_try_merge(__rq, bio))) {
|
||||
*req = __rq;
|
||||
q->last_merge = __rq;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ELEVATOR_NO_MERGE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
|
||||
|
||||
Reference in New Issue
Block a user