From: Bernhard Urban Date: Mon, 4 Jan 2010 04:06:41 +0000 (+0100) Subject: port-work; won't compile or even work X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=ppcskel.git;a=commitdiff_plain;h=HEAD port-work; won't compile or even work --- diff --git a/usb/drivers/class/storage.c b/usb/drivers/class/storage.c index 0bc39e3..ce3cead 100644 --- a/usb/drivers/class/storage.c +++ b/usb/drivers/class/storage.c @@ -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 -#include -#include -#include -#include -#include -#include -#include - -#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 */ diff --git a/usb/drivers/class/storage.h b/usb/drivers/class/storage.h index bee975d..fa028ed 100644 --- a/usb/drivers/class/storage.h +++ b/usb/drivers/class/storage.h @@ -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 */