port-work; won't compile or even work master
authorBernhard Urban <lewurm@gmx.net>
Mon, 4 Jan 2010 04:06:41 +0000 (05:06 +0100)
committerBernhard Urban <lewurm@gmx.net>
Mon, 4 Jan 2010 04:06:43 +0000 (05:06 +0100)
usb/drivers/class/storage.c
usb/drivers/class/storage.h

index 0bc39e3c05ac8492cc72ec06156e4b6503967e09..ce3ceadc54abe136252bcceaf61ca59b049cb03c 100644 (file)
@@ -38,6 +38,8 @@
 #include "../../core/usb.h"
 #include "../../usbspec/usb11spec.h"
 #include "../../../malloc.h"
+#include "../../../string.h"
+#include "../../../irq.h"
 
 #include "storage.h"
 
@@ -205,22 +207,6 @@ u8 usb_storage_write_sector(u8 device, u32 sector, char * buf)
        return 0;
 }
 
-#include <gccore.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <errno.h>
-#include <lwp_heap.h>
-#include <malloc.h>
-
-#include "asm.h"
-#include "processor.h"
-#include "disc_io.h"
-
-#define ROUNDDOWN32(v)                         (((u32)(v)-0x1f)&~0x1f)
-
-#define        HEAP_SIZE                       (32*1024)
 #define        TAG_START                       0x0BADC0DE
 
 #define        CBW_SIZE                        31
@@ -257,10 +243,6 @@ u8 usb_storage_write_sector(u8 device, u32 sector, char * buf)
 
 #define DEVLIST_MAXSIZE    8
 
-static heap_cntrl __heap;
-static u8 __heap_created = 0;
-static lwpq_t __usbstorage_waitq = 0;
-
 /*
 The following is for implementing a DISC_INTERFACE 
 as used by libfat
@@ -281,114 +263,40 @@ static s32 __usbstorage_clearerrors(usbstorage_handle *dev, u8 lun);
  *      for the USB data/IOS reply..
  */
 
-static s32 __usb_blkmsg_cb(s32 retval, void *dummy)
-{
-       usbstorage_handle *dev = (usbstorage_handle *)dummy;
-       dev->retval = retval;
-       SYS_CancelAlarm(dev->alarm);
-       LWP_ThreadBroadcast(__usbstorage_waitq);
-       return 0;
-}
-
 static s32 __usb_deviceremoved_cb(s32 retval,void *arg)
 {
        return 0;
 }
 
-static void __usb_timeouthandler(syswd_t alarm,void *cbarg)
-{
-       usbstorage_handle *dev = (usbstorage_handle*)cbarg;
-       dev->retval = USBSTORAGE_ETIMEDOUT;
-       LWP_ThreadBroadcast(__usbstorage_waitq);
-}
-
-static void __usb_settimeout(usbstorage_handle *dev)
-{
-       struct timespec ts;
-
-       ts.tv_sec = 2;
-       ts.tv_nsec = 0;
-       SYS_SetAlarm(dev->alarm,&ts,__usb_timeouthandler,dev);
-}
-
 static s32 __USB_BlkMsgTimeout(usbstorage_handle *dev, u8 bEndpoint, u16 wLength, void *rpData)
 {
-       u32 level;
        s32 retval;
 
        dev->retval = USBSTORAGE_PROCESSING;
-       retval = USB_WriteBlkMsgAsync(dev->usb_fd, bEndpoint, wLength, rpData, __usb_blkmsg_cb, (void *)dev);
-       if(retval < 0) return retval;
-
-       __usb_settimeout(dev);
-
-       _CPU_ISR_Disable(level);
-       do {
-               retval = dev->retval;
-               if(retval!=USBSTORAGE_PROCESSING) break;
-               else LWP_ThreadSleep(__usbstorage_waitq);
-       } while(retval==USBSTORAGE_PROCESSING);
-       _CPU_ISR_Restore(level);
+       retval = USB_WriteBlkMsgAsync(dev->usb_fd, bEndpoint, wLength, rpData, (void *)dev);
+       dev->retval = retval;
 
-       if(retval==USBSTORAGE_ETIMEDOUT) USBStorage_Close(dev);
+       if(retval==USBSTORAGE_ETIMEDOUT) 
+               USBStorage_Close(dev);
        return retval;
 }
 
 static s32 __USB_CtrlMsgTimeout(usbstorage_handle *dev, u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, void *rpData)
 {
-       u32 level;
        s32 retval;
-       struct timespec ts;
-
-       ts.tv_sec = 2;
-       ts.tv_nsec = 0;
-
 
        dev->retval = USBSTORAGE_PROCESSING;
-       retval = USB_WriteCtrlMsgAsync(dev->usb_fd, bmRequestType, bmRequest, wValue, wIndex, wLength, rpData, __usb_blkmsg_cb, (void *)dev);
-       if(retval < 0) return retval;
-
-       __usb_settimeout(dev);
-
-       _CPU_ISR_Disable(level);
-       do {
-               retval = dev->retval;
-               if(retval!=USBSTORAGE_PROCESSING) break;
-               else LWP_ThreadSleep(__usbstorage_waitq);
-       } while(retval==USBSTORAGE_PROCESSING);
-       _CPU_ISR_Restore(level);
+       retval = USB_WriteCtrlMsgAsync(dev->usb_fd, bmRequestType, bmRequest, wValue, wIndex, wLength, rpData, (void *)dev);
+       dev->retval = retval;
 
-       if(retval==USBSTORAGE_ETIMEDOUT) USBStorage_Close(dev);
+       if(retval==USBSTORAGE_ETIMEDOUT)
+               USBStorage_Close(dev);
        return retval;
 }
 
 s32 USBStorage_Initialize()
 {
-       u8 *ptr;
-       u32 level;
-
-       _CPU_ISR_Disable(level);
-       if(__heap_created != 0) {
-               _CPU_ISR_Restore(level);
-               return IPC_OK;
-       }
-       
-       LWP_InitQueue(&__usbstorage_waitq);
-
-       ptr = (u8*)ROUNDDOWN32(((u32)SYS_GetArena2Hi() - HEAP_SIZE));
-       if((u32)ptr < (u32)SYS_GetArena2Lo()) {
-               _CPU_ISR_Restore(level);
-               return IPC_ENOMEM;
-       }
-
-       SYS_SetArena2Hi(ptr);
-
-       __lwp_heap_init(&__heap, ptr, HEAP_SIZE, 32);
-       __heap_created = 1;
-       _CPU_ISR_Restore(level);
-
-       return IPC_OK;
-
+       return 0;
 }
 
 static s32 __send_cbw(usbstorage_handle *dev, u8 lun, u32 len, u8 flags, const u8 *cb, u8 cbLen)
@@ -396,7 +304,7 @@ static s32 __send_cbw(usbstorage_handle *dev, u8 lun, u32 len, u8 flags, const u
        s32 retval = USBSTORAGE_OK;
 
        if(cbLen == 0 || cbLen > 16)
-               return IPC_EINVAL;
+               return -1;
        
        memset(dev->buffer, 0, CBW_SIZE);
 
@@ -462,7 +370,6 @@ static s32 __cycle(usbstorage_handle *dev, u8 lun, u8 *buffer, u32 len, u8 *cb,
 
        s8 retries = USBSTORAGE_CYCLE_RETRIES + 1;
 
-       LWP_MutexLock(dev->lock);
        do
        {
                retries--;
@@ -570,7 +477,6 @@ static s32 __cycle(usbstorage_handle *dev, u8 lun, u8 *buffer, u32 len, u8 *cb,
                if(__usbstorage_reset(dev) == USBSTORAGE_ETIMEDOUT)
                        retval = USBSTORAGE_ETIMEDOUT;
        }
-       LWP_MutexUnlock(dev->lock);
 
 
        if(_status != NULL)
@@ -621,6 +527,17 @@ static s32 __usbstorage_reset(usbstorage_handle *dev)
                dev->suspended = 0;
        }
 
+       /* control message request type bitmask */
+#define USB_CTRLTYPE_DIR_HOST2DEVICE   (0<<7)
+#define USB_CTRLTYPE_DIR_DEVICE2HOST   (1<<7)
+#define USB_CTRLTYPE_TYPE_STANDARD             (0<<5)
+#define USB_CTRLTYPE_TYPE_CLASS                        (1<<5)
+#define USB_CTRLTYPE_TYPE_VENDOR               (2<<5)
+#define USB_CTRLTYPE_TYPE_RESERVED             (3<<5)
+#define USB_CTRLTYPE_REC_DEVICE                        0
+#define USB_CTRLTYPE_REC_INTERFACE             1
+#define USB_CTRLTYPE_REC_ENDPOINT              2
+#define USB_CTRLTYPE_REC_OTHER                 3
        retval = __USB_CtrlMsgTimeout(dev, (USB_CTRLTYPE_DIR_HOST2DEVICE | USB_CTRLTYPE_TYPE_CLASS | USB_CTRLTYPE_REC_INTERFACE), USBSTORAGE_RESET, 0, dev->interface, 0, NULL);
 
        /* FIXME?: some devices return -7004 here which definitely violates the usb ms protocol but they still seem to be working... */
@@ -649,16 +566,12 @@ s32 USBStorage_Open(usbstorage_handle *dev, const char *bus, u16 vid, u16 pid)
        usb_interfacedesc *uid;
        usb_endpointdesc *ued;
 
-       max_lun = __lwp_heap_allocate(&__heap, 1);
+       max_lun = malloc(1);
        if(max_lun==NULL) return IPC_ENOMEM;
 
        memset(dev, 0, sizeof(*dev));
 
        dev->tag = TAG_START;
-       if(LWP_MutexInit(&dev->lock, false) < 0)
-               goto free_and_return;
-       if(SYS_CreateAlarm(&dev->alarm)<0)
-               goto free_and_return;
 
        retval = USB_OpenDevice(bus, vid, pid, &dev->usb_fd);
        if(retval < 0)
@@ -724,9 +637,7 @@ found:
        if(retval < 0)
                goto free_and_return;
 
-       LWP_MutexLock(dev->lock);
        retval = __USB_CtrlMsgTimeout(dev, (USB_CTRLTYPE_DIR_DEVICE2HOST | USB_CTRLTYPE_TYPE_CLASS | USB_CTRLTYPE_REC_INTERFACE), USBSTORAGE_GET_MAX_LUN, 0, dev->interface, 1, max_lun);
-       LWP_MutexUnlock(dev->lock);
        if(retval < 0)
                dev->max_lun = 1;
        else
@@ -757,7 +668,7 @@ found:
        USB_ClearHalt(dev->usb_fd, dev->ep_in);
        USB_ClearHalt(dev->usb_fd, dev->ep_out);
 
-       dev->buffer = __lwp_heap_allocate(&__heap, MAX_TRANSFER_SIZE);
+       dev->buffer = malloc(MAX_TRANSFER_SIZE);
        
        if(dev->buffer == NULL) retval = IPC_ENOMEM;
        else {
@@ -766,14 +677,12 @@ found:
        }
 
 free_and_return:
-       if(max_lun!=NULL) __lwp_heap_free(&__heap, max_lun);
+       if(max_lun!=NULL) free(max_lun);
        if(retval < 0)
        {
                USB_CloseDevice(&dev->usb_fd);
-               LWP_MutexDestroy(dev->lock);
-               SYS_RemoveAlarm(dev->alarm);
                if(dev->buffer != NULL)
-                       __lwp_heap_free(&__heap, dev->buffer);
+                       free(dev->buffer);
                if(dev->sector_size != NULL)
                        free(dev->sector_size);
                memset(dev, 0, sizeof(*dev));
@@ -785,12 +694,10 @@ free_and_return:
 s32 USBStorage_Close(usbstorage_handle *dev)
 {
        USB_CloseDevice(&dev->usb_fd);
-       LWP_MutexDestroy(dev->lock);
-       SYS_RemoveAlarm(dev->alarm);
        if(dev->sector_size!=NULL)
                free(dev->sector_size);
        if(dev->buffer!=NULL)
-               __lwp_heap_free(&__heap, dev->buffer);
+               free(dev->buffer);
        memset(dev, 0, sizeof(*dev));
        return 0;
 }
@@ -799,9 +706,7 @@ s32 USBStorage_Reset(usbstorage_handle *dev)
 {
        s32 retval;
 
-       LWP_MutexLock(dev->lock);
        retval = __usbstorage_reset(dev);
-       LWP_MutexUnlock(dev->lock);
 
        return retval;
 }
@@ -910,16 +815,16 @@ The following is for implementing a DISC_INTERFACE
 as used by libfat
 */
 
-static bool __usbstorage_IsInserted(void);
+static BOOL __usbstorage_IsInserted(void);
 
-static bool __usbstorage_Startup(void)
+static BOOL __usbstorage_Startup(void)
 {
        USB_Initialize();
        USBStorage_Initialize();
        return __usbstorage_IsInserted();
 }
 
-static bool __usbstorage_IsInserted(void)
+static BOOL __usbstorage_IsInserted(void)
 {
    u8 *buffer;
    u8 dummy;
@@ -930,9 +835,9 @@ static bool __usbstorage_IsInserted(void)
 
    __mounted = 0;              //reset it here and check if device is still attached
 
-   buffer = __lwp_heap_allocate(&__heap, DEVLIST_MAXSIZE << 3);
+   buffer = malloc(DEVLIST_MAXSIZE << 3);
    if(buffer == NULL)
-       return false;
+       return FALSE;
    memset(buffer, 0, DEVLIST_MAXSIZE << 3);
 
    if(USB_GetDeviceList("/dev/usb/oh0", buffer, DEVLIST_MAXSIZE, 0, &dummy) < 0)
@@ -943,8 +848,8 @@ static bool __usbstorage_IsInserted(void)
        __vid = 0;
        __pid = 0;
 
-       __lwp_heap_free(&__heap,buffer);
-       return false;
+       free(buffer);
+       return FALSE;
    }
 
    if(__vid!=0 || __pid!=0)
@@ -959,9 +864,9 @@ static bool __usbstorage_IsInserted(void)
                if( (vid == __vid) && (pid == __pid))
                {
                    __mounted = 1;
-                                  __lwp_heap_free(&__heap,buffer);
+                                  free(buffer);
                    usleep(50); // I don't know why I have to wait but it's needed
-                   return true;
+                   return TRUE;
                }
            }
        }
@@ -1003,18 +908,18 @@ static bool __usbstorage_IsInserted(void)
            break;
        }
    }
-   __lwp_heap_free(&__heap,buffer);
+   free(buffer);
    if(__mounted == 1)
-       return true;
-   return false;
+       return TRUE;
+   return FALSE;
 }
 
-static bool __usbstorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
+static BOOL __usbstorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
 {
    s32 retval;
 
    if(__mounted != 1)
-       return false;
+       return FALSE;
 
    retval = USBStorage_Read(&__usbfd, __lun, sector, numSectors, buffer);
    if(retval == USBSTORAGE_ETIMEDOUT)
@@ -1022,16 +927,16 @@ static bool __usbstorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
        __mounted = 0;
    }
    if(retval < 0)
-       return false;
-   return true;
+       return FALSE;
+   return TRUE;
 }
 
-static bool __usbstorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer)
+static BOOL __usbstorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer)
 {
    s32 retval;
 
    if(__mounted != 1)
-       return false;
+       return FALSE;
 
    retval = USBStorage_Write(&__usbfd, __lun, sector, numSectors, buffer);
    if(retval == USBSTORAGE_ETIMEDOUT)
@@ -1039,20 +944,20 @@ static bool __usbstorage_WriteSectors(u32 sector, u32 numSectors, const void *bu
        __mounted = 0;
    }
    if(retval < 0)
-       return false;
-   return true;
+       return FALSE;
+   return TRUE;
 }
 
-static bool __usbstorage_ClearStatus(void)
+static BOOL __usbstorage_ClearStatus(void)
 {
-   return true;
+   return TRUE;
 }
 
-static bool __usbstorage_Shutdown(void)
+static BOOL __usbstorage_Shutdown(void)
 {
    //if(__mounted == 1) USBStorage_Close(&__usbfd);
    __mounted = 0;
-   return true;
+   return TRUE;
 }
 
 const DISC_INTERFACE __io_usbstorage = {
@@ -1066,4 +971,3 @@ const DISC_INTERFACE __io_usbstorage = {
    (FN_MEDIUM_SHUTDOWN)&__usbstorage_Shutdown
 };
 
-#endif /* HW_RVL */
index bee975de10da194a82f120625fe49999089a99f5..fa028edf58e91596d1872c9764fb18f68104ac77 100644 (file)
@@ -144,5 +144,12 @@ s32 USBStorage_Write(usbstorage_handle *dev, u8 lun, u32 sector, u16 n_sectors,
 
 extern const DISC_INTERFACE __io_usbstorage;
 #endif
+#define __stwbrx(base,index,value)     \
+       __asm__ volatile ("stwbrx       %0,%1,%2" : : "r"(value), "b%"(index), "r"(base) : "memory")
+
+#define __lwbrx(base,index)                    \
+({     register u32 res;                               \
+       __asm__ volatile ("lwbrx        %0,%1,%2" : "=r"(res) : "b%"(index), "r"(base) : "memory"); \
+       res; })
 
 #endif /* __STORAGE_H */