Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 126549
b: refs/heads/master
c: f37435c
h: refs/heads/master
i:
  126547: fa537a9
v: v3
  • Loading branch information
Pekka Enberg authored and Greg Kroah-Hartman committed Jan 6, 2009
1 parent 518733e commit b17d2e6
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 113 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a55a89b175a1802e89b5654e2b9ae84ed032ea22
refs/heads/master: f37435ce8611a2c60f434ddfec8e6dfcd51829fc
190 changes: 95 additions & 95 deletions trunk/drivers/staging/winbond/linux/wb35reg.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Wb35Reg_BurstWrite(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterData, u8 N
{
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
struct urb *urb = NULL;
PREG_QUEUE pRegQueue = NULL;
struct wb35_reg_queue *reg_queue = NULL;
u16 UrbSize;
struct usb_ctrlrequest *dr;
u16 i, DataSize = NumberOfData*4;
Expand All @@ -24,34 +24,34 @@ Wb35Reg_BurstWrite(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterData, u8 N
return FALSE;

// Trying to use burst write function if use new hardware
UrbSize = sizeof(REG_QUEUE) + DataSize + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize );
UrbSize = sizeof(struct wb35_reg_queue) + DataSize + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&reg_queue, UrbSize );
urb = wb_usb_alloc_urb(0);
if( urb && pRegQueue ) {
pRegQueue->DIRECT = 2;// burst write register
pRegQueue->INDEX = RegisterNo;
pRegQueue->pBuffer = (u32 *)((u8 *)pRegQueue + sizeof(REG_QUEUE));
memcpy( pRegQueue->pBuffer, pRegisterData, DataSize );
if( urb && reg_queue ) {
reg_queue->DIRECT = 2;// burst write register
reg_queue->INDEX = RegisterNo;
reg_queue->pBuffer = (u32 *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue));
memcpy( reg_queue->pBuffer, pRegisterData, DataSize );
//the function for reversing register data from little endian to big endian
for( i=0; i<NumberOfData ; i++ )
pRegQueue->pBuffer[i] = cpu_to_le32( pRegQueue->pBuffer[i] );
reg_queue->pBuffer[i] = cpu_to_le32( reg_queue->pBuffer[i] );

dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE) + DataSize);
dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue) + DataSize);
dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE;
dr->bRequest = 0x04; // USB or vendor-defined request code, burst mode
dr->wValue = cpu_to_le16( Flag ); // 0: Register number auto-increment, 1: No auto increment
dr->wIndex = cpu_to_le16( RegisterNo );
dr->wLength = cpu_to_le16( DataSize );
pRegQueue->Next = NULL;
pRegQueue->pUsbReq = dr;
pRegQueue->urb = urb;
reg_queue->Next = NULL;
reg_queue->pUsbReq = dr;
reg_queue->urb = urb;

spin_lock_irq( &pWb35Reg->EP0VM_spin_lock );
if (pWb35Reg->pRegFirst == NULL)
pWb35Reg->pRegFirst = pRegQueue;
if (pWb35Reg->reg_first == NULL)
pWb35Reg->reg_first = reg_queue;
else
pWb35Reg->pRegLast->Next = pRegQueue;
pWb35Reg->pRegLast = pRegQueue;
pWb35Reg->reg_last->Next = reg_queue;
pWb35Reg->reg_last = reg_queue;

spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );

Expand All @@ -62,8 +62,8 @@ Wb35Reg_BurstWrite(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterData, u8 N
} else {
if (urb)
usb_free_urb(urb);
if (pRegQueue)
kfree(pRegQueue);
if (reg_queue)
kfree(reg_queue);
return FALSE;
}
return FALSE;
Expand Down Expand Up @@ -164,7 +164,7 @@ Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue )
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
struct usb_ctrlrequest *dr;
struct urb *urb = NULL;
PREG_QUEUE pRegQueue = NULL;
struct wb35_reg_queue *reg_queue = NULL;
u16 UrbSize;


Expand All @@ -173,32 +173,32 @@ Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue )
return FALSE;

// update the register by send urb request------------------------------------
UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize );
UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&reg_queue, UrbSize );
urb = wb_usb_alloc_urb(0);
if (urb && pRegQueue) {
pRegQueue->DIRECT = 1;// burst write register
pRegQueue->INDEX = RegisterNo;
pRegQueue->VALUE = cpu_to_le32(RegisterValue);
pRegQueue->RESERVED_VALID = FALSE;
dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE));
if (urb && reg_queue) {
reg_queue->DIRECT = 1;// burst write register
reg_queue->INDEX = RegisterNo;
reg_queue->VALUE = cpu_to_le32(RegisterValue);
reg_queue->RESERVED_VALID = FALSE;
dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue));
dr->bRequestType = USB_TYPE_VENDOR|USB_DIR_OUT |USB_RECIP_DEVICE;
dr->bRequest = 0x03; // USB or vendor-defined request code, burst mode
dr->wValue = cpu_to_le16(0x0);
dr->wIndex = cpu_to_le16(RegisterNo);
dr->wLength = cpu_to_le16(4);

// Enter the sending queue
pRegQueue->Next = NULL;
pRegQueue->pUsbReq = dr;
pRegQueue->urb = urb;
reg_queue->Next = NULL;
reg_queue->pUsbReq = dr;
reg_queue->urb = urb;

spin_lock_irq(&pWb35Reg->EP0VM_spin_lock );
if (pWb35Reg->pRegFirst == NULL)
pWb35Reg->pRegFirst = pRegQueue;
if (pWb35Reg->reg_first == NULL)
pWb35Reg->reg_first = reg_queue;
else
pWb35Reg->pRegLast->Next = pRegQueue;
pWb35Reg->pRegLast = pRegQueue;
pWb35Reg->reg_last->Next = reg_queue;
pWb35Reg->reg_last = reg_queue;

spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );

Expand All @@ -209,7 +209,7 @@ Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue )
} else {
if (urb)
usb_free_urb(urb);
kfree(pRegQueue);
kfree(reg_queue);
return FALSE;
}
}
Expand All @@ -225,41 +225,41 @@ Wb35Reg_WriteWithCallbackValue( phw_data_t pHwData, u16 RegisterNo, u32 Register
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
struct usb_ctrlrequest *dr;
struct urb *urb = NULL;
PREG_QUEUE pRegQueue = NULL;
struct wb35_reg_queue *reg_queue = NULL;
u16 UrbSize;

// Module shutdown
if (pHwData->SurpriseRemove)
return FALSE;

// update the register by send urb request------------------------------------
UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC((void* *) &pRegQueue, UrbSize );
UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC((void* *) &reg_queue, UrbSize );
urb = wb_usb_alloc_urb(0);
if (urb && pRegQueue) {
pRegQueue->DIRECT = 1;// burst write register
pRegQueue->INDEX = RegisterNo;
pRegQueue->VALUE = cpu_to_le32(RegisterValue);
if (urb && reg_queue) {
reg_queue->DIRECT = 1;// burst write register
reg_queue->INDEX = RegisterNo;
reg_queue->VALUE = cpu_to_le32(RegisterValue);
//NOTE : Users must guarantee the size of value will not exceed the buffer size.
memcpy(pRegQueue->RESERVED, pValue, Len);
pRegQueue->RESERVED_VALID = TRUE;
dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE));
memcpy(reg_queue->RESERVED, pValue, Len);
reg_queue->RESERVED_VALID = TRUE;
dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue));
dr->bRequestType = USB_TYPE_VENDOR|USB_DIR_OUT |USB_RECIP_DEVICE;
dr->bRequest = 0x03; // USB or vendor-defined request code, burst mode
dr->wValue = cpu_to_le16(0x0);
dr->wIndex = cpu_to_le16(RegisterNo);
dr->wLength = cpu_to_le16(4);

// Enter the sending queue
pRegQueue->Next = NULL;
pRegQueue->pUsbReq = dr;
pRegQueue->urb = urb;
reg_queue->Next = NULL;
reg_queue->pUsbReq = dr;
reg_queue->urb = urb;
spin_lock_irq (&pWb35Reg->EP0VM_spin_lock );
if( pWb35Reg->pRegFirst == NULL )
pWb35Reg->pRegFirst = pRegQueue;
if( pWb35Reg->reg_first == NULL )
pWb35Reg->reg_first = reg_queue;
else
pWb35Reg->pRegLast->Next = pRegQueue;
pWb35Reg->pRegLast = pRegQueue;
pWb35Reg->reg_last->Next = reg_queue;
pWb35Reg->reg_last = reg_queue;

spin_unlock_irq ( &pWb35Reg->EP0VM_spin_lock );

Expand All @@ -269,7 +269,7 @@ Wb35Reg_WriteWithCallbackValue( phw_data_t pHwData, u16 RegisterNo, u32 Register
} else {
if (urb)
usb_free_urb(urb);
kfree(pRegQueue);
kfree(reg_queue);
return FALSE;
}
}
Expand Down Expand Up @@ -332,39 +332,39 @@ Wb35Reg_Read(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue )
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
struct usb_ctrlrequest * dr;
struct urb *urb;
PREG_QUEUE pRegQueue;
struct wb35_reg_queue *reg_queue;
u16 UrbSize;

// Module shutdown
if (pHwData->SurpriseRemove)
return FALSE;

// update the variable by send Urb to read register ------------------------------------
UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize );
UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest);
OS_MEMORY_ALLOC( (void* *)&reg_queue, UrbSize );
urb = wb_usb_alloc_urb(0);
if( urb && pRegQueue )
if( urb && reg_queue )
{
pRegQueue->DIRECT = 0;// read register
pRegQueue->INDEX = RegisterNo;
pRegQueue->pBuffer = pRegisterValue;
dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE));
reg_queue->DIRECT = 0;// read register
reg_queue->INDEX = RegisterNo;
reg_queue->pBuffer = pRegisterValue;
dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue));
dr->bRequestType = USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN;
dr->bRequest = 0x01; // USB or vendor-defined request code, burst mode
dr->wValue = cpu_to_le16(0x0);
dr->wIndex = cpu_to_le16 (RegisterNo);
dr->wLength = cpu_to_le16 (4);

// Enter the sending queue
pRegQueue->Next = NULL;
pRegQueue->pUsbReq = dr;
pRegQueue->urb = urb;
reg_queue->Next = NULL;
reg_queue->pUsbReq = dr;
reg_queue->urb = urb;
spin_lock_irq ( &pWb35Reg->EP0VM_spin_lock );
if( pWb35Reg->pRegFirst == NULL )
pWb35Reg->pRegFirst = pRegQueue;
if( pWb35Reg->reg_first == NULL )
pWb35Reg->reg_first = reg_queue;
else
pWb35Reg->pRegLast->Next = pRegQueue;
pWb35Reg->pRegLast = pRegQueue;
pWb35Reg->reg_last->Next = reg_queue;
pWb35Reg->reg_last = reg_queue;

spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );

Expand All @@ -375,7 +375,7 @@ Wb35Reg_Read(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue )
} else {
if (urb)
usb_free_urb( urb );
kfree(pRegQueue);
kfree(reg_queue);
return FALSE;
}
}
Expand All @@ -401,7 +401,7 @@ Wb35Reg_EP0VM(phw_data_t pHwData )
struct usb_ctrlrequest *dr;
u32 * pBuffer;
int ret = -1;
PREG_QUEUE pRegQueue;
struct wb35_reg_queue *reg_queue;


if (pWb35Reg->SyncIoPause)
Expand All @@ -412,23 +412,23 @@ Wb35Reg_EP0VM(phw_data_t pHwData )

// Get the register data and send to USB through Irp
spin_lock_irq( &pWb35Reg->EP0VM_spin_lock );
pRegQueue = pWb35Reg->pRegFirst;
reg_queue = pWb35Reg->reg_first;
spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );

if (!pRegQueue)
if (!reg_queue)
goto cleanup;

// Get an Urb, send it
urb = (struct urb *)pRegQueue->urb;
urb = (struct urb *)reg_queue->urb;

dr = pRegQueue->pUsbReq;
urb = pRegQueue->urb;
pBuffer = pRegQueue->pBuffer;
if (pRegQueue->DIRECT == 1) // output
pBuffer = &pRegQueue->VALUE;
dr = reg_queue->pUsbReq;
urb = reg_queue->urb;
pBuffer = reg_queue->pBuffer;
if (reg_queue->DIRECT == 1) // output
pBuffer = &reg_queue->VALUE;

usb_fill_control_urb( urb, pHwData->WbUsb.udev,
REG_DIRECTION(pHwData->WbUsb.udev,pRegQueue),
REG_DIRECTION(pHwData->WbUsb.udev,reg_queue),
(u8 *)dr,pBuffer,cpu_to_le16(dr->wLength),
Wb35Reg_EP0VM_complete, (void*)pHwData);

Expand Down Expand Up @@ -456,7 +456,7 @@ Wb35Reg_EP0VM_complete(struct urb *urb)
{
phw_data_t pHwData = (phw_data_t)urb->context;
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
PREG_QUEUE pRegQueue;
struct wb35_reg_queue *reg_queue;


// Variable setting
Expand All @@ -469,10 +469,10 @@ Wb35Reg_EP0VM_complete(struct urb *urb)
} else {
// Complete to send, remove the URB from the first
spin_lock_irq( &pWb35Reg->EP0VM_spin_lock );
pRegQueue = pWb35Reg->pRegFirst;
if (pRegQueue == pWb35Reg->pRegLast)
pWb35Reg->pRegLast = NULL;
pWb35Reg->pRegFirst = pWb35Reg->pRegFirst->Next;
reg_queue = pWb35Reg->reg_first;
if (reg_queue == pWb35Reg->reg_last)
pWb35Reg->reg_last = NULL;
pWb35Reg->reg_first = pWb35Reg->reg_first->Next;
spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );

if (pWb35Reg->EP0VM_status) {
Expand All @@ -489,7 +489,7 @@ Wb35Reg_EP0VM_complete(struct urb *urb)
Wb35Reg_EP0VM(pHwData);
}

kfree(pRegQueue);
kfree(reg_queue);
}

usb_free_urb(urb);
Expand All @@ -501,7 +501,7 @@ Wb35Reg_destroy(phw_data_t pHwData)
{
PWB35REG pWb35Reg = &pHwData->Wb35Reg;
struct urb *urb;
PREG_QUEUE pRegQueue;
struct wb35_reg_queue *reg_queue;


Uxx_power_off_procedure(pHwData);
Expand All @@ -514,25 +514,25 @@ Wb35Reg_destroy(phw_data_t pHwData)

// Release all the data in RegQueue
spin_lock_irq( &pWb35Reg->EP0VM_spin_lock );
pRegQueue = pWb35Reg->pRegFirst;
while (pRegQueue) {
if (pRegQueue == pWb35Reg->pRegLast)
pWb35Reg->pRegLast = NULL;
pWb35Reg->pRegFirst = pWb35Reg->pRegFirst->Next;
reg_queue = pWb35Reg->reg_first;
while (reg_queue) {
if (reg_queue == pWb35Reg->reg_last)
pWb35Reg->reg_last = NULL;
pWb35Reg->reg_first = pWb35Reg->reg_first->Next;

urb = pRegQueue->urb;
urb = reg_queue->urb;
spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );
if (urb) {
usb_free_urb(urb);
kfree(pRegQueue);
kfree(reg_queue);
} else {
#ifdef _PE_REG_DUMP_
WBDEBUG(("EP0 queue release error\n"));
#endif
}
spin_lock_irq( &pWb35Reg->EP0VM_spin_lock );

pRegQueue = pWb35Reg->pRegFirst;
reg_queue = pWb35Reg->reg_first;
}
spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock );
}
Expand Down
Loading

0 comments on commit b17d2e6

Please sign in to comment.