|
@@ -45,33 +45,6 @@ static unsigned long gCardIndex;
|
|
|
|
|
|
#define MAX_RCV_LOOP 100
|
|
|
|
|
|
-/****************************************************************
|
|
|
- * ft1000_control_complete
|
|
|
- ****************************************************************/
|
|
|
-static void ft1000_control_complete(struct urb *urb)
|
|
|
-{
|
|
|
- struct ft1000_device *ft1000dev = (struct ft1000_device *)urb->context;
|
|
|
-
|
|
|
- //DEBUG("FT1000_CONTROL_COMPLETE ENTERED\n");
|
|
|
- if (ft1000dev == NULL )
|
|
|
- {
|
|
|
- DEBUG("NULL ft1000dev, failure\n");
|
|
|
- return ;
|
|
|
- }
|
|
|
- else if ( ft1000dev->dev == NULL )
|
|
|
- {
|
|
|
- DEBUG("NULL ft1000dev->dev, failure\n");
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- if(waitqueue_active(&ft1000dev->control_wait))
|
|
|
- {
|
|
|
- wake_up(&ft1000dev->control_wait);
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG("FT1000_CONTROL_COMPLETE RETURNED\n");
|
|
|
-}
|
|
|
-
|
|
|
//---------------------------------------------------------------------------
|
|
|
// Function: ft1000_control
|
|
|
//
|
|
@@ -1023,178 +996,6 @@ static void ft1000_usb_transmit_complete(struct urb *urb)
|
|
|
//DEBUG("Return from ft1000_usb_transmit_complete\n");
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-/****************************************************************
|
|
|
- * ft1000_control
|
|
|
- ****************************************************************/
|
|
|
-static int ft1000_read_fifo_reg(struct ft1000_device *ft1000dev,unsigned int pipe,
|
|
|
- u8 request,
|
|
|
- u8 requesttype,
|
|
|
- u16 value,
|
|
|
- u16 index,
|
|
|
- void *data,
|
|
|
- u16 size,
|
|
|
- int timeout)
|
|
|
-{
|
|
|
- u16 ret;
|
|
|
-
|
|
|
- DECLARE_WAITQUEUE(wait, current);
|
|
|
- struct urb *urb;
|
|
|
- struct usb_ctrlrequest *dr;
|
|
|
- int status;
|
|
|
-
|
|
|
- if (ft1000dev == NULL )
|
|
|
- {
|
|
|
- DEBUG("NULL ft1000dev, failure\n");
|
|
|
- return STATUS_FAILURE;
|
|
|
- }
|
|
|
- else if ( ft1000dev->dev == NULL )
|
|
|
- {
|
|
|
- DEBUG("NULL ft1000dev->dev, failure\n");
|
|
|
- return STATUS_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- spin_lock(&ft1000dev->device_lock);
|
|
|
-
|
|
|
- if(in_interrupt())
|
|
|
- {
|
|
|
- spin_unlock(&ft1000dev->device_lock);
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
-
|
|
|
- urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
|
- dr = kmalloc(sizeof(struct usb_ctrlrequest), in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
|
|
|
-
|
|
|
- if(!urb || !dr)
|
|
|
- {
|
|
|
- kfree(dr);
|
|
|
- usb_free_urb(urb);
|
|
|
- spin_unlock(&ft1000dev->device_lock);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- dr->bRequestType = requesttype;
|
|
|
- dr->bRequest = request;
|
|
|
- dr->wValue = value;
|
|
|
- dr->wIndex = index;
|
|
|
- dr->wLength = size;
|
|
|
-
|
|
|
- usb_fill_control_urb(urb, ft1000dev->dev, pipe, (char*)dr, (void*)data, size, (void *)ft1000_control_complete, (void*)ft1000dev);
|
|
|
-
|
|
|
-
|
|
|
- init_waitqueue_head(&ft1000dev->control_wait);
|
|
|
-
|
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
|
-
|
|
|
- add_wait_queue(&ft1000dev->control_wait, &wait);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- status = usb_submit_urb(urb, GFP_KERNEL);
|
|
|
-
|
|
|
- if(status)
|
|
|
- {
|
|
|
- usb_free_urb(urb);
|
|
|
- kfree(dr);
|
|
|
- remove_wait_queue(&ft1000dev->control_wait, &wait);
|
|
|
- spin_unlock(&ft1000dev->device_lock);
|
|
|
- return status;
|
|
|
- }
|
|
|
-
|
|
|
- if(urb->status == -EINPROGRESS)
|
|
|
- {
|
|
|
- while(timeout && urb->status == -EINPROGRESS)
|
|
|
- {
|
|
|
- status = timeout = schedule_timeout(timeout);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- status = 1;
|
|
|
- }
|
|
|
-
|
|
|
- remove_wait_queue(&ft1000dev->control_wait, &wait);
|
|
|
-
|
|
|
- if(!status)
|
|
|
- {
|
|
|
- usb_unlink_urb(urb);
|
|
|
- printk("ft1000 timeout\n");
|
|
|
- status = -ETIMEDOUT;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- status = urb->status;
|
|
|
-
|
|
|
- if(urb->status)
|
|
|
- {
|
|
|
- printk("ft1000 control message failed (urb addr: %p) with error number: %i\n", urb, (int)status);
|
|
|
-
|
|
|
- usb_clear_halt(ft1000dev->dev, usb_rcvctrlpipe(ft1000dev->dev, 0));
|
|
|
- usb_clear_halt(ft1000dev->dev, usb_sndctrlpipe(ft1000dev->dev, 0));
|
|
|
- usb_unlink_urb(urb);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- usb_free_urb(urb);
|
|
|
- kfree(dr);
|
|
|
- spin_unlock(&ft1000dev->device_lock);
|
|
|
- return ret;
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//---------------------------------------------------------------------------
|
|
|
-// Function: ft1000_read_fifo_len
|
|
|
-//
|
|
|
-// Parameters: ft1000dev - device structure
|
|
|
-//
|
|
|
-//
|
|
|
-// Returns: none
|
|
|
-//
|
|
|
-// Description: read the fifo length register content
|
|
|
-//
|
|
|
-// Notes:
|
|
|
-//
|
|
|
-//---------------------------------------------------------------------------
|
|
|
-static inline u16 ft1000_read_fifo_len (struct net_device *dev)
|
|
|
-{
|
|
|
- u16 temp;
|
|
|
- u16 ret;
|
|
|
-
|
|
|
- struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev);
|
|
|
- struct ft1000_device *ft1000dev = info->pFt1000Dev;
|
|
|
-// DEBUG("ft1000_read_fifo_len: enter ft1000dev %x\n", ft1000dev); //aelias [-] reason: warning: format ???%x??? expects type ???unsigned int???, but argument 2 has type ???struct ft1000_device *???
|
|
|
- DEBUG("ft1000_read_fifo_len: enter ft1000dev %p\n", ft1000dev); //aelias [+] reason: up
|
|
|
-
|
|
|
- ret = STATUS_SUCCESS;
|
|
|
-
|
|
|
- ret = ft1000_read_fifo_reg(ft1000dev,
|
|
|
- usb_rcvctrlpipe(ft1000dev->dev,0),
|
|
|
- HARLEY_READ_REGISTER,
|
|
|
- HARLEY_READ_OPERATION,
|
|
|
- 0,
|
|
|
- FT1000_REG_MAG_UFSR,
|
|
|
- &temp,
|
|
|
- 2,
|
|
|
- LARGE_TIMEOUT);
|
|
|
-
|
|
|
- if (ret>0)
|
|
|
- ret = STATUS_SUCCESS;
|
|
|
- else
|
|
|
- ret = STATUS_FAILURE;
|
|
|
-
|
|
|
- DEBUG("ft1000_read_fifo_len: returned %d\n", temp);
|
|
|
-
|
|
|
- return (temp- 16);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
//---------------------------------------------------------------------------
|
|
|
//
|
|
|
// Function: ft1000_copy_down_pkt
|