diff --git a/.gitmodules b/.gitmodules index a4e9b1ecb..7bf600b5f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@ [submodule "lib/sdl/SDL2_image"] path = lib/sdl/SDL2_image url = https://github.com/libsdl-org/SDL_image.git +[submodule "lib/usb/libusbohci"] + path = lib/usb/libusbohci + url = https://github.com/XboxDev/libusbohci.git diff --git a/lib/hal/Makefile b/lib/hal/Makefile index 830196e97..c8b5e3894 100644 --- a/lib/hal/Makefile +++ b/lib/hal/Makefile @@ -2,7 +2,6 @@ HAL_SRCS := \ $(NXDK_DIR)/lib/hal/audio.c \ $(NXDK_DIR)/lib/hal/debug.c \ $(NXDK_DIR)/lib/hal/fileio.c \ - $(NXDK_DIR)/lib/hal/input.c \ $(NXDK_DIR)/lib/hal/io.c \ $(NXDK_DIR)/lib/hal/led.c \ $(NXDK_DIR)/lib/hal/video.c \ diff --git a/lib/hal/input.c b/lib/hal/input.c deleted file mode 100644 index d4af971e1..000000000 --- a/lib/hal/input.c +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include -#include -#include - -#define XPAD_ANALOG_BUTTON_INTF 0x30 -#define USB_IRQ 1 - -XPAD_INPUT g_Pads[4]; -XPAD_INPUT g_DefaultPad; - -XMOUSE_INPUT g_Mouse; - -/* Has input been inited already? */ -static BOOL bInputOK = FALSE; -static BOOL bInputPolling = FALSE; -static KINTERRUPT InterruptObject; -static KDPC DPCObject; - -/* Stores time and XPAD state */ -extern struct xpad_data XPAD_current[4]; -extern struct xpad_data XPAD_last[4]; - -/* Stores Mouse state */ -extern struct xmouse_data XMOUSE_current; - -void BootStartUSB(void); -void USBGetEvents(void); -void BootStopUSB(void); - -int GetKeyboardStroke(XKEYBOARD_STROKE *pStroke); - -static void __stdcall DPC(PKDPC Dpc, - PVOID DeferredContext, - PVOID SystemArgument1, - PVOID SystemArgument2) -{ - //DPCs allow to use non reentrant procedures (called sequentially, FOR SURE). - //CAUTION : if you use fpu in DPC you have to save & restore yourself fpu state!!! - //(fpu=floating point unit, i.e the coprocessor executing floating point opcodes) - - USBGetEvents(); - return; -} - -void handle_irqs(int); - -static BOOLEAN __stdcall ISR(PKINTERRUPT Interrupt, PVOID ServiceContext) -{ - KeInsertQueueDpc(&DPCObject,NULL,NULL); //calls USBGetEvents() very soon - *((DWORD*)0xFED00014)=0x80000000; - return TRUE; -} - -void XInput_Init(void) -{ - int i; - ULONG tmp; - KIRQL irql; - ULONG vector; - if(bInputOK) { - return; - } - - bInputOK = TRUE; - bInputPolling = FALSE; - - // Zero our pad structures - for(i=0; i<4; i++) - memset(&g_Pads[i], 0x00, sizeof(XPAD_INPUT)); - - // Zero the mouse data - memset(&g_Mouse, 0x00, sizeof(XMOUSE_INPUT)); - - // Startup the cromwell usb code - BootStartUSB(); - - // Get the current state of our devices - XInput_GetEvents(); - - vector = HalGetInterruptVector(USB_IRQ, &irql); - - KeInitializeDpc(&DPCObject,&DPC,NULL); - - KeInitializeInterrupt(&InterruptObject, - &ISR, - NULL, - vector, - irql, - LevelSensitive, - FALSE); - - KeConnectInterrupt(&InterruptObject); -} - -void XInput_Init_Polling(void) -{ - int i; - - if(bInputOK) { - return; - } - bInputOK = TRUE; - bInputPolling = TRUE; - - // Zero our pad structures - for(i=0; i<4; i++) - memset(&g_Pads[i], 0x00, sizeof(XPAD_INPUT)); - - // Zero the mouse data - memset(&g_Mouse, 0x00, sizeof(XMOUSE_INPUT)); - - // Startup the cromwell usb code - BootStartUSB(); - - // Get the current state of our devices - XInput_GetEvents(); -} - -void XInput_Quit(void) -{ - if(!bInputOK) - return; - - int i; - - // Stop the cromwell usb code - BootStopUSB(); - - // Zero our pad structures - for(i=0; i<4; i++) - memset(&g_Pads[i], 0x00, sizeof(XPAD_INPUT)); - - // Zero the mouse data - memset(&g_Mouse, 0x00, sizeof(XMOUSE_INPUT)); - - if (!bInputPolling) { - KeDisconnectInterrupt(&InterruptObject); - } - - bInputOK = FALSE; -} - -void XInput_GetEvents(void) -{ - int pad, button; - int iLThumbX, iLThumbY, iRThumbX, iRThumbY; - if (bInputPolling) { - USBGetEvents(); - } - - for(pad=0; pad<4; pad++) - { - g_Pads[pad].hPresent = XPAD_current[pad].hPresent; - - if(!g_Pads[pad].hPresent) - { - memset(&g_Pads[pad], 0x00, sizeof(XPAD_INPUT)); - continue; - } - - // Digital buttons - dpad (up, down, left, right), start, back, left thumb, right thumb - g_Pads[pad].CurrentButtons.usDigitalButtons = XPAD_current[pad].pad | (XPAD_current[pad].state << 4); - - // Analog buttons - g_Pads[pad].CurrentButtons.ucAnalogButtons[0] - = (XPAD_current[pad].keys[0] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[0] : 0; // A - g_Pads[pad].CurrentButtons.ucAnalogButtons[1] - = (XPAD_current[pad].keys[1] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[1] : 0; // B - g_Pads[pad].CurrentButtons.ucAnalogButtons[2] - = (XPAD_current[pad].keys[2] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[2] : 0; // X - g_Pads[pad].CurrentButtons.ucAnalogButtons[3] - = (XPAD_current[pad].keys[3] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[3] : 0; // Y - g_Pads[pad].CurrentButtons.ucAnalogButtons[4] - = (XPAD_current[pad].keys[4] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[4] : 0; // Black - g_Pads[pad].CurrentButtons.ucAnalogButtons[5] - = (XPAD_current[pad].keys[5] > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].keys[5] : 0; // White - - - g_Pads[pad].CurrentButtons.ucAnalogButtons[6] - = (XPAD_current[pad].trig_left > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].trig_left : 0; // Left trigger - g_Pads[pad].CurrentButtons.ucAnalogButtons[7] - = (XPAD_current[pad].trig_right > XPAD_ANALOG_BUTTON_INTF) ? XPAD_current[pad].trig_right : 0; // Right trigger - - // Thumbsticks - g_Pads[pad].sLThumbX = XPAD_current[pad].stick_left_x; // Left stick X - g_Pads[pad].sLThumbY = XPAD_current[pad].stick_left_y; // Left stick Y - g_Pads[pad].sRThumbX = XPAD_current[pad].stick_right_x; // Right stick X - g_Pads[pad].sRThumbY = XPAD_current[pad].stick_right_y; // Right stick Y - - - // Track changes for buttons - g_Pads[pad].PressedButtons.usDigitalButtons = - g_Pads[pad].CurrentButtons.usDigitalButtons & (g_Pads[pad].LastButtons.usDigitalButtons ^ g_Pads[pad].CurrentButtons.usDigitalButtons); - - g_Pads[pad].LastButtons.usDigitalButtons = g_Pads[pad].CurrentButtons.usDigitalButtons; - - for(button=0; button<8; button++) - { - g_Pads[pad].PressedButtons.ucAnalogButtons[button] = - (g_Pads[pad].CurrentButtons.ucAnalogButtons[button] > XPAD_ANALOG_BUTTON_INTF) & - (g_Pads[pad].LastButtons.ucAnalogButtons[button] ^ - (g_Pads[pad].CurrentButtons.ucAnalogButtons[button] > XPAD_ANALOG_BUTTON_INTF)); - - g_Pads[pad].LastButtons.ucAnalogButtons[button] = (g_Pads[pad].CurrentButtons.ucAnalogButtons[button] > XPAD_ANALOG_BUTTON_INTF); - } - } - - //Fill combination gamepad - memset(&g_DefaultPad, 0x00, sizeof(XPAD_INPUT)); - - iLThumbX = iLThumbY = iRThumbX = iRThumbY = 0; - - for(pad=0; pad<4; pad++) - { - g_DefaultPad.CurrentButtons.usDigitalButtons |= g_Pads[pad].CurrentButtons.usDigitalButtons; - g_DefaultPad.LastButtons.usDigitalButtons |= g_Pads[pad].LastButtons.usDigitalButtons; - g_DefaultPad.PressedButtons.usDigitalButtons |= g_Pads[pad].PressedButtons.usDigitalButtons; - - iLThumbX += g_Pads[pad].sLThumbX; - iLThumbY += g_Pads[pad].sLThumbY; - iRThumbX += g_Pads[pad].sRThumbX; - iRThumbY += g_Pads[pad].sRThumbY; - - for(button=0; button<8; button++) - { - if(g_Pads[pad].CurrentButtons.ucAnalogButtons[button] >= g_DefaultPad.CurrentButtons.ucAnalogButtons[button]) - { - g_DefaultPad.CurrentButtons.ucAnalogButtons[button] = g_Pads[pad].CurrentButtons.ucAnalogButtons[button]; - } - - g_DefaultPad.LastButtons.ucAnalogButtons[button] |= g_Pads[pad].LastButtons.ucAnalogButtons[button]; - g_DefaultPad.PressedButtons.ucAnalogButtons[button] |= g_Pads[pad].PressedButtons.ucAnalogButtons[button]; - } - } - - g_DefaultPad.sLThumbX = (iLThumbX & 0xffff); - g_DefaultPad.sLThumbY = (iLThumbY & 0xffff); - g_DefaultPad.sRThumbX = (iRThumbX & 0xffff); - g_DefaultPad.sRThumbY = (iRThumbY & 0xffff); - - // Mouse status - memcpy(&g_Mouse, &XMOUSE_current, sizeof(XMOUSE_INPUT)); -} - -int XInputGetPadCount(void) -{ - int pad; - int numpads = 0; - - for(pad=0; pad<4; pad++) - { - if(XPAD_current[pad].hPresent) - numpads++; - } - - return numpads; -} - -int XInputGetKeystroke(XKEYBOARD_STROKE *pStroke) -{ - return GetKeyboardStroke(pStroke); -} - -XMOUSE_INPUT XInputGetMouseData(void) -{ - return g_Mouse; -} diff --git a/lib/hal/input.h b/lib/hal/input.h deleted file mode 100644 index c3ca1af28..000000000 --- a/lib/hal/input.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef HAL_INPUT_H -#define HAL_INPUT_H - -#include "pad.h" -#include "mouse.h" -#include "keyboard.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -/* General input functions */ -__attribute__((deprecated)) -void XInput_Init(void); -void XInput_Init_Polling(void); -void XInput_Quit(void); -void XInput_GetEvents(void); - -/* Pad specific functions */ -int XInputGetPadCount(void); - -/* Keyboard specific functions */ -int XInputGetKeystroke(XKEYBOARD_STROKE *pStroke); - -/* Mouse specific functions */ -XMOUSE_INPUT XInputGetMouseData(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/hal/keyboard.h b/lib/hal/keyboard.h deleted file mode 100644 index f7a7797dd..000000000 --- a/lib/hal/keyboard.h +++ /dev/null @@ -1,274 +0,0 @@ -#ifndef _KEYBOARD_H -#define _KEYBOARD_H - -typedef struct _XKEYBOARD_STROKE -{ - unsigned char ucFlags; - unsigned char ucKeyCode; - unsigned char ucAsciiValue; -} XKEYBOARD_STROKE; - -// Modifier key flag values -#define XKEYBOARD_LCONTROL_FLAG 0x01 -#define XKEYBOARD_LSHIFT_FLAG 0x02 -#define XKEYBOARD_LALT_FLAG 0x04 -#define XKEYBOARD_LWINDOWS_FLAG 0x08 -#define XKEYBOARD_RCONTROL_FLAG 0x10 -#define XKEYBOARD_RSHIFT_FLAG 0x20 -#define XKEYBOARD_RALT_FLAG 0x40 -#define XKEYBOARD_RWINDOWS_FLAG 0x80 - -// usb keyboard usage values for key modifiers -#define USB_KEYBOARD_USAGE_LCONTROL 0xE0 -#define USB_KEYBOARD_USAGE_LSHIFT 0xE1 -#define USB_KEYBOARD_USAGE_LALT 0xE2 -#define USB_KEYBOARD_USAGE_LWINDOWS 0xE3 -#define USB_KEYBOARD_USAGE_RCONTROL 0xE4 -#define USB_KEYBOARD_USAGE_RSHIFT 0xE5 -#define USB_KEYBOARD_USAGE_RALT 0xE6 -#define USB_KEYBOARD_USAGE_RWINDOWS 0xE7 - -// keyboard state flags - keyup, shift, ctrl, alt etc -#define XKEYBOARD_KEYUP 0x01 -#define XKEYBOARD_SHIFT 0x02 -#define XKEYBOARD_CONTROL 0x04 -#define XKEYBOARD_ALT 0x08 - -// key code constants -#define XKEY_INVALID 0x00 - -#define XKEY_LBUTTON 0x01 -#define XKEY_RBUTTON 0x02 -#define XKEY_CANCEL 0x03 -#define XKEY_MBUTTON 0x04 -#define XKEY_XBUTTON1 0x05 -#define XKEY_XBUTTON2 0x06 - -#define XKEY_BACKSPACE 0x08 -#define XKEY_TAB 0x09 - - -#define XKEY_CLEAR 0x0C -#define XKEY_RETURN 0x0D - - -#define XKEY_SHIFT 0x10 -#define XKEY_CONTROL 0x11 -#define XKEY_MENU 0x12 -#define XKEY_PAUSE 0x13 -#define XKEY_CAPSLOCK 0x14 -#define XKEY_KANA 0x15 -#define XKEY_JUNJA 0x17 -#define XKEY_FINAL 0x18 -#define XKEY_KANJI 0x19 - -#define XKEY_ESCAPE 0x1B -#define XKEY_CONVERT 0x1C -#define XKEY_NONCONVERT 0x1D -#define XKEY_ACCEPT 0x1E -#define XKEY_MODECHANGE 0x1F -#define XKEY_SPACE 0x20 -#define XKEY_PRIOR 0x21 -#define XKEY_NEXT 0x22 -#define XKEY_END 0x23 -#define XKEY_HOME 0x24 -#define XKEY_LEFT 0x25 -#define XKEY_UP 0x26 -#define XKEY_RIGHT 0x27 -#define XKEY_DOWN 0x28 -#define XKEY_SELECT 0x29 -#define XKEY_PRINT 0x2A -#define XKEY_EXECUTE 0x2B -#define XKEY_PRINTSCREEN 0x2C -#define XKEY_INSERT 0x2D -#define XKEY_DELETE 0x2E -#define XKEY_HELP 0x2F -#define XKEY_0 0x30 -#define XKEY_1 0x31 -#define XKEY_2 0x32 -#define XKEY_3 0x33 -#define XKEY_4 0x34 -#define XKEY_5 0x35 -#define XKEY_6 0x36 -#define XKEY_7 0x37 -#define XKEY_8 0x38 -#define XKEY_9 0x39 - -#define XKEY_A 0x41 -#define XKEY_B 0x42 -#define XKEY_C 0x43 -#define XKEY_D 0x44 -#define XKEY_E 0x45 -#define XKEY_F 0x46 -#define XKEY_G 0x47 -#define XKEY_H 0x48 -#define XKEY_I 0x49 -#define XKEY_J 0x4A -#define XKEY_K 0x4B -#define XKEY_L 0x4C -#define XKEY_M 0x4D -#define XKEY_N 0x4E -#define XKEY_O 0x4F -#define XKEY_P 0x50 -#define XKEY_Q 0x51 -#define XKEY_R 0x52 -#define XKEY_S 0x53 -#define XKEY_T 0x54 -#define XKEY_U 0x55 -#define XKEY_V 0x56 -#define XKEY_W 0x57 -#define XKEY_X 0x58 -#define XKEY_Y 0x59 -#define XKEY_Z 0x5A -#define XKEY_LWIN 0x5B -#define XKEY_RWIN 0x5C -#define XKEY_APPS 0x5D - -#define XKEY_SLEEP 0x5F -#define XKEY_NUMPAD0 0x60 -#define XKEY_NUMPAD1 0x61 -#define XKEY_NUMPAD2 0x62 -#define XKEY_NUMPAD3 0x63 -#define XKEY_NUMPAD4 0x64 -#define XKEY_NUMPAD5 0x65 -#define XKEY_NUMPAD6 0x66 -#define XKEY_NUMPAD7 0x67 -#define XKEY_NUMPAD8 0x68 -#define XKEY_NUMPAD9 0x69 -#define XKEY_MULTIPLY 0x6A -#define XKEY_ADD 0x6B -#define XKEY_NUMPAD_ENTER 0x6C -#define XKEY_SUBTRACT 0x6D -#define XKEY_DECIMAL 0x6E -#define XKEY_DIVIDE 0x6F -#define XKEY_F1 0x70 -#define XKEY_F2 0x71 -#define XKEY_F3 0x72 -#define XKEY_F4 0x73 -#define XKEY_F5 0x74 -#define XKEY_F6 0x75 -#define XKEY_F7 0x76 -#define XKEY_F8 0x77 -#define XKEY_F9 0x78 -#define XKEY_F10 0x79 -#define XKEY_F11 0x7A -#define XKEY_F12 0x7B -#define XKEY_F13 0x7C -#define XKEY_F14 0x7D -#define XKEY_F15 0x7E -#define XKEY_F16 0x7F -#define XKEY_F17 0x80 -#define XKEY_F18 0x81 -#define XKEY_F19 0x82 -#define XKEY_F20 0x83 -#define XKEY_F21 0x84 -#define XKEY_F22 0x85 -#define XKEY_F23 0x86 -#define XKEY_F24 0x87 - - - - - - - - -#define XKEY_NUMLOCK 0x90 -#define XKEY_SCROLL_LOCK 0x91 -#define XKEY_NUMPADEQUALS 0x92 - -/* - * Fujitsu/OASYS kbd definitions - */ -#define XKEY_OEM_FJ_JISHO 0x92 // 'Dictionary' key -#define XKEY_OEM_FJ_MASSHOU 0x93 // 'Unregister word' key -#define XKEY_OEM_FJ_TOUROKU 0x94 // 'Register word' key -#define XKEY_OEM_FJ_LOYA 0x95 // 'Left OYAYUBI' key -#define XKEY_OEM_FJ_ROYA 0x96 // 'Right OYAYUBI' key - - - - - - - - -#define XKEY_LSHIFT 0xA0 -#define XKEY_RSHIFT 0xA1 -#define XKEY_LCONTROL 0xA2 -#define XKEY_RCONTROL 0xA3 -#define XKEY_LMENU 0xA4 -#define XKEY_RMENU 0xA5 -#define XKEY_BROWSER_BACK 0xA6 -#define XKEY_BROWSER_FORWARD 0xA7 -#define XKEY_BROWSER_REFRESH 0xA8 -#define XKEY_BROWSER_STOP 0xA9 -#define XKEY_BROWSER_SEARCH 0xAA -#define XKEY_BROWSER_FAVORITES 0xAB -#define XKEY_BROWSER_HOME 0xAC -#define XKEY_VOLUME_MUTE 0xAD -#define XKEY_VOLUME_DOWN 0xAE -#define XKEY_VOLUME_UP 0xAF -#define XKEY_MEDIA_NEXT_TRACK 0xB0 -#define XKEY_MEDIA_PREV_TRACK 0xB1 -#define XKEY_MEDIA_STOP 0xB2 -#define XKEY_MEDIA_PLAY_PAUSE 0xB3 -#define XKEY_LAUNCH_MAIL 0xB4 -#define XKEY_LAUNCH_MEDIA_SELECT 0xB5 -#define XKEY_LAUNCH_APP1 0xB6 -#define XKEY_LAUNCH_APP2 0xB7 - - -#define XKEY_SEMICOLON 0xBA -#define XKEY_EQUALS 0xBB -#define XKEY_COMMA 0xBC -#define XKEY_MINUS 0xBD -#define XKEY_PERIOD 0xBE -#define XKEY_SLASH 0xBF -#define XKEY_GRAVE 0xC0 - - - - - - -#define XKEY_LBRACE 0xDB -#define XKEY_BACKSLASH 0xDC -#define XKEY_RBRACE 0xDD -#define XKEY_QUOTE 0xDE -#define XKEY_MISC 0xDF - -#define XKEY_OEM_AX 0xE1 -#define XKEY_OEM_102 0xE2 -#define XKEY_ICO_HELP 0xE3 -#define XKEY_ICO_00 0xE4 -#define XKEY_PROCESSKEY 0xE5 -#define XKEY_ICO_CLEAR 0xE6 -#define XKEY_PACKET 0xE7 - -#define XKEY_OEM_RESET 0xE9 -#define XKEY_OEM_JUMP 0xEA -#define XKEY_OEM_PA1 0xEB -#define XKEY_OEM_PA2 0xEC -#define XKEY_OEM_PA3 0xED -#define XKEY_OEM_WSCTRL 0xEE -#define XKEY_OEM_CUSEL 0xEF -#define XKEY_OEM_ATTN 0xF0 -#define XKEY_OEM_FINISH 0xF1 -#define XKEY_OEM_COPY 0xF2 -#define XKEY_OEM_AUTO 0xF3 -#define XKEY_OEM_ENLW 0xF4 -#define XKEY_OEM_BACKTAB 0xF5 - -#define XKEY_ATTN 0xF6 -#define XKEY_CRSEL 0xF7 -#define XKEY_EXSEL 0xF8 -#define XKEY_EREOF 0xF9 -#define XKEY_PLAY 0xFA -#define XKEY_ZOOM 0xFB -#define XKEY_NONAME 0xFC -#define XKEY_PA1 0xFD -#define XKEY_OEM_CLEAR 0xFE - - -#endif diff --git a/lib/hal/mouse.h b/lib/hal/mouse.h deleted file mode 100644 index 4c7c4f799..000000000 --- a/lib/hal/mouse.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef HAL_MOUSE_H -#define HAL_MOUSE_H - -#if defined(__cplusplus) -extern "C" -{ -#endif - -struct xmouse_data -{ - unsigned char buttons; - char x; - char y; - char wheel; -}; - -#define XMOUSE_BUTTON_1 0x01 -#define XMOUSE_BUTTON_2 0x02 -#define XMOUSE_BUTTON_3 0x04 -#define XMOUSE_BUTTON_4 0x08 -#define XMOUSE_BUTTON_5 0x10 - - -typedef struct _XMOUSE_INPUT -{ - unsigned char ucButtons; - char cX; - char cY; - char cWheel; -} XMOUSE_INPUT; - -extern XMOUSE_INPUT g_Mouse; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/sdl/SDL2 b/lib/sdl/SDL2 index a2a2d9ca1..60ff41089 160000 --- a/lib/sdl/SDL2 +++ b/lib/sdl/SDL2 @@ -1 +1 @@ -Subproject commit a2a2d9ca1a5a7082c830490a0b110829939de3a7 +Subproject commit 60ff4108911ed4028c27fd910e476d29ab679525 diff --git a/lib/usb/Makefile b/lib/usb/Makefile index b57c9fe48..3ad8a8e91 100644 --- a/lib/usb/Makefile +++ b/lib/usb/Makefile @@ -1,32 +1,78 @@ -USB_SRCS := \ - $(NXDK_DIR)/lib/usb/host/ohci-hcd.c \ - $(NXDK_DIR)/lib/usb/core/message.c \ - $(NXDK_DIR)/lib/usb/core/hcd.c \ - $(NXDK_DIR)/lib/usb/core/hcd-pci.c \ - $(NXDK_DIR)/lib/usb/core/hub.c \ - $(NXDK_DIR)/lib/usb/core/usb.c \ - $(NXDK_DIR)/lib/usb/core/config.c \ - $(NXDK_DIR)/lib/usb/core/urb.c \ - $(NXDK_DIR)/lib/usb/core/buffer_simple.c \ - $(NXDK_DIR)/lib/usb/core/usb-debug.c \ - $(NXDK_DIR)/lib/usb/sys/BootUSB.c \ - $(NXDK_DIR)/lib/usb/sys/linuxwrapper.c \ - $(NXDK_DIR)/lib/usb/sys/xpad.c \ - $(NXDK_DIR)/lib/usb/sys/xremote.c \ - $(NXDK_DIR)/lib/usb/sys/usbkey.c \ - $(NXDK_DIR)/lib/usb/sys/usbmouse.c \ - $(NXDK_DIR)/lib/usb/misc/misc.c \ - $(NXDK_DIR)/lib/usb/misc/pci.c \ - $(NXDK_DIR)/lib/usb/misc/malloc.c - -USB_OBJS = $(addsuffix .obj, $(basename $(USB_SRCS))) - -$(NXDK_DIR)/lib/libnxdk_usb.lib: $(USB_OBJS) - -main.exe: $(NXDK_DIR)/lib/libnxdk_usb.lib - -CLEANRULES += clean-usb - -.PHONY: clean-usb -clean-usb: - $(VE)rm -f $(USB_OBJS) $(NXDK_DIR)/lib/libnxdk_usb.lib +USBH_DIR=$(NXDK_DIR)/lib/usb + +# USB Host core +USB_CORE_SRCS := \ + $(USBH_DIR)/libusbohci/src_core/hub.c \ + $(USBH_DIR)/libusbohci/src_core/mem_alloc.c \ + $(USBH_DIR)/libusbohci/src_core/ohci.c \ + $(USBH_DIR)/libusbohci/src_core/support.c \ + $(USBH_DIR)/libusbohci/src_core/usb_core.c + +USBH_OBJS = $(addsuffix .obj, $(basename $(USB_CORE_SRCS))) + +# Xbox specific files +USB_XBOX_SRCS := \ + $(USBH_DIR)/libusbohci_xbox/usbh_xbox.c \ + $(USBH_DIR)/libusbohci_xbox/xid_driver.c + +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_XBOX_SRCS))) + +# USB Human Input Device class driver +ifneq ($(NXDK_USB_ENABLE_HID),) +USB_HID_SRCS := \ + $(USBH_DIR)/libusbohci/src_hid/hid_core.c \ + $(USBH_DIR)/libusbohci/src_hid/hid_driver.c + +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_HID_SRCS))) +endif + +# USB Communication Device class driver +ifneq ($(NXDK_USB_ENABLE_CDC),) +USB_CDC_SRCS := \ + $(USBH_DIR)/libusbohci/src_cdc/cdc_core.c \ + $(USBH_DIR)/libusbohci/src_cdc/cdc_driver.c \ + $(USBH_DIR)/libusbohci/src_cdc/cdc_parser.c + +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_CDC_SRCS))) +endif + +# USB Audio class driver +ifneq ($(NXDK_USB_ENABLE_UAC),) +USB_UAC_SRCS := \ + $(USBH_DIR)/libusbohci/src_uac/uac_core.c \ + $(USBH_DIR)/libusbohci/src_uac/uac_driver.c \ + $(USBH_DIR)/libusbohci/src_uac/uac_parser.c + +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_UAC_SRCS))) +endif + +# USB Video class driver +ifneq ($(NXDK_USB_ENABLE_UVC),) +USB_UVC_SRCS := \ + $(USBH_DIR)/libusbohci/src_uvc/uvc_core.c \ + $(USBH_DIR)/libusbohci/src_uvc/uvc_driver.c \ + $(USBH_DIR)/libusbohci/src_uvc/uvc_parser.c + +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_UVC_SRCS))) +endif + +# Mass Storage Class driver +ifneq ($(NXDK_USB_ENABLE_MSC),) +USB_MSC_SRCS := \ + $(USBH_DIR)/libusbohci/src_msc/msc_driver.c \ + $(USBH_DIR)/libusbohci/src_msc/msc_xfer.c +USBH_OBJS += $(addsuffix .obj, $(basename $(USB_MSC_SRCS))) +endif + +$(NXDK_DIR)/lib/nxdk_usb.lib: $(USBH_OBJS) + +NXDK_CFLAGS += -I$(USBH_DIR)/libusbohci/inc -I$(USBH_DIR)/libusbohci_xbox/ -DUSBH_USE_EXTERNAL_CONFIG=\"usbh_config_xbox.h\" +NXDK_CXXFLAGS += -I$(USBH_DIR)/libusbohci/inc -I$(USBH_DIR)/libusbohci_xbox/ -DUSBH_USE_EXTERNAL_CONFIG=\"usbh_config_xbox.h\" + +main.exe: $(NXDK_DIR)/lib/nxdk_usb.lib + +CLEANRULES += clean-usb + +.PHONY: clean-usb +clean-usb: + $(VE)rm -f $(USBH_OBJS) $(NXDK_DIR)/lib/nxdk_usb.lib diff --git a/lib/usb/bulk.h b/lib/usb/bulk.h deleted file mode 100644 index 9edfced54..000000000 --- a/lib/usb/bulk.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************/ -/* */ -/* File: pad.h */ -/* bkenwright@xbdev.net - www.xbdev.net */ -/* */ -/******************************************************************************/ - -/******************************************************************************/ -/* - What on earth! Whats this file for? - Well once we have our usb device address set...for the xbox gamepad :) - This file will do some simple commands...sending bulk test messages - ...an example would be to send a rumble message? - Also probe for some button presses? - - In Development though. -*/ -/******************************************************************************/ - - -#ifndef __PAD__ -#define __PAD__ - - -#include -#include - - - - -/******************************************************************************/ -/* */ -/* Functions */ -/* */ -/******************************************************************************/ - - -void usb_bulk_msg( usbd_device * dev, int size, void * data ); // Send data to the USB - -void usb_bulk_msg_in( usbd_device * dev, int size, void * data ); // Get data from the USB - - - - -#endif // __PAD__ diff --git a/lib/usb/core/buffer_simple.c b/lib/usb/core/buffer_simple.c deleted file mode 100644 index b0c047023..000000000 --- a/lib/usb/core/buffer_simple.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * buffer_simple.c -- replacement for usb/core/buffer.c - * - * (c) Georg Acher, georg@acher.org - * - */ - -#include "../usb_wrapper.h" -#define __KERNEL__ -#define CONFIG_PCI -#include "hcd.h" - -/*------------------------------------------------------------------------*/ -int hcd_buffer_create (struct usb_hcd *hcd) -{ - return 0; -} -/*------------------------------------------------------------------------*/ -void hcd_buffer_destroy (struct usb_hcd *hcd) -{ -} -/*------------------------------------------------------------------------*/ -void *hcd_buffer_alloc ( - struct usb_bus *bus, - size_t size, - int mem_flags, - dma_addr_t *dma -) -{ - return kmalloc(size,0); -} -/*------------------------------------------------------------------------*/ -void hcd_buffer_free ( - struct usb_bus *bus, - size_t size, - void *addr, - dma_addr_t dma -) -{ - kfree(addr); -} - diff --git a/lib/usb/core/config.c b/lib/usb/core/config.c deleted file mode 100644 index c380cc470..000000000 --- a/lib/usb/core/config.c +++ /dev/null @@ -1,508 +0,0 @@ -#if 0 -#include -#include -#include -#include -#include -#else -#include "../usb_wrapper.h" -#endif - -#define USB_MAXALTSETTING 128 /* Hard limit */ -#define USB_MAXENDPOINTS 30 /* Hard limit */ - -/* these maximums are arbitrary */ -#define USB_MAXCONFIG 8 -#define USB_ALTSETTINGALLOC 4 -#define USB_MAXINTERFACES 32 - -static int usb_parse_endpoint(struct usb_host_endpoint *endpoint, unsigned char *buffer, int size) -{ - struct usb_descriptor_header *header; - unsigned char *begin; - int parsed = 0, len, numskipped; - - header = (struct usb_descriptor_header *)buffer; - - /* Everything should be fine being passed into here, but we sanity */ - /* check JIC */ - if (header->bLength > size) { - err("ran out of descriptors parsing"); - return -1; - } - - if (header->bDescriptorType != USB_DT_ENDPOINT) { - warn("unexpected descriptor 0x%X, expecting endpoint, 0x%X", - header->bDescriptorType, USB_DT_ENDPOINT); - return parsed; - } - - if (header->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) - memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_AUDIO_SIZE); - else - memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_SIZE); - - le16_to_cpus(&endpoint->desc.wMaxPacketSize); - - buffer += header->bLength; - size -= header->bLength; - parsed += header->bLength; - - /* Skip over the rest of the Class Specific or Vendor Specific */ - /* descriptors */ - begin = buffer; - numskipped = 0; - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if (header->bLength < 2) { - err("invalid descriptor length of %d", header->bLength); - return -1; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header->bDescriptorType == USB_DT_ENDPOINT) || - (header->bDescriptorType == USB_DT_INTERFACE) || - (header->bDescriptorType == USB_DT_CONFIG) || - (header->bDescriptorType == USB_DT_DEVICE)) - break; - - dbg("skipping descriptor 0x%X", - header->bDescriptorType); - numskipped++; - - buffer += header->bLength; - size -= header->bLength; - parsed += header->bLength; - } - if (numskipped) - dbg("skipped %d class/vendor specific endpoint descriptors", numskipped); - - /* Copy any unknown descriptors into a storage area for drivers */ - /* to later parse */ - len = (int)(buffer - begin); - if (!len) { - endpoint->extra = NULL; - endpoint->extralen = 0; - return parsed; - } - - endpoint->extra = kmalloc(len, GFP_KERNEL); - - if (!endpoint->extra) { - err("couldn't allocate memory for endpoint extra descriptors"); - endpoint->extralen = 0; - return parsed; - } - - memcpy(endpoint->extra, begin, len); - endpoint->extralen = len; - - return parsed; -} - -static int usb_parse_interface(struct usb_interface *interface, unsigned char *buffer, int size) -{ - int i, len, numskipped, retval, parsed = 0; - struct usb_descriptor_header *header; - struct usb_host_interface *ifp; - unsigned char *begin; - - interface->act_altsetting = 0; - interface->num_altsetting = 0; - interface->max_altsetting = USB_ALTSETTINGALLOC; - device_initialize(&interface->dev); - - interface->altsetting = kmalloc(sizeof(*interface->altsetting) * interface->max_altsetting, - GFP_KERNEL); - - if (!interface->altsetting) { - err("couldn't kmalloc interface->altsetting"); - return -1; - } - - while (size > 0) { - struct usb_interface_descriptor *d; - - if (interface->num_altsetting >= interface->max_altsetting) { - struct usb_host_interface *ptr; - int oldmas; - - oldmas = interface->max_altsetting; - interface->max_altsetting += USB_ALTSETTINGALLOC; - if (interface->max_altsetting > USB_MAXALTSETTING) { - warn("too many alternate settings (incr %d max %d)\n", - USB_ALTSETTINGALLOC, USB_MAXALTSETTING); - return -1; - } - - ptr = kmalloc(sizeof(*ptr) * interface->max_altsetting, GFP_KERNEL); - if (ptr == NULL) { - err("couldn't kmalloc interface->altsetting"); - return -1; - } - memcpy(ptr, interface->altsetting, sizeof(*interface->altsetting) * oldmas); - kfree(interface->altsetting); - interface->altsetting = ptr; - } - - ifp = interface->altsetting + interface->num_altsetting; - ifp->endpoint = NULL; - ifp->extra = NULL; - ifp->extralen = 0; - interface->num_altsetting++; - - memcpy(ifp, buffer, USB_DT_INTERFACE_SIZE); - - /* Skip over the interface */ - buffer += ifp->desc.bLength; - parsed += ifp->desc.bLength; - size -= ifp->desc.bLength; - - begin = buffer; - numskipped = 0; - - /* Skip over any interface, class or vendor descriptors */ - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if (header->bLength < 2) { - err("invalid descriptor length of %d", header->bLength); - return -1; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header->bDescriptorType == USB_DT_INTERFACE) || - (header->bDescriptorType == USB_DT_ENDPOINT) || - (header->bDescriptorType == USB_DT_CONFIG) || - (header->bDescriptorType == USB_DT_DEVICE)) - break; - - numskipped++; - - buffer += header->bLength; - parsed += header->bLength; - size -= header->bLength; - } - - if (numskipped) - dbg("skipped %d class/vendor specific interface descriptors", numskipped); - - /* Copy any unknown descriptors into a storage area for */ - /* drivers to later parse */ - len = (int)(buffer - begin); - if (len) { - ifp->extra = kmalloc(len, GFP_KERNEL); - - if (!ifp->extra) { - err("couldn't allocate memory for interface extra descriptors"); - ifp->extralen = 0; - return -1; - } - memcpy(ifp->extra, begin, len); - ifp->extralen = len; - } - - /* Did we hit an unexpected descriptor? */ - header = (struct usb_descriptor_header *)buffer; - if ((size >= sizeof(struct usb_descriptor_header)) && - ((header->bDescriptorType == USB_DT_CONFIG) || - (header->bDescriptorType == USB_DT_DEVICE))) - return parsed; - - if (ifp->desc.bNumEndpoints > USB_MAXENDPOINTS) { - warn("too many endpoints"); - return -1; - } - - ifp->endpoint = (struct usb_host_endpoint *) - kmalloc(ifp->desc.bNumEndpoints * - sizeof(struct usb_host_endpoint), GFP_KERNEL); - if (!ifp->endpoint) { - err("out of memory"); - return -1; - } - - memset(ifp->endpoint, 0, ifp->desc.bNumEndpoints * - sizeof(struct usb_host_endpoint)); - - for (i = 0; i < ifp->desc.bNumEndpoints; i++) { - header = (struct usb_descriptor_header *)buffer; - - if (header->bLength > size) { - err("ran out of descriptors parsing"); - return -1; - } - - retval = usb_parse_endpoint(ifp->endpoint + i, buffer, size); - if (retval < 0) - return retval; - - buffer += retval; - parsed += retval; - size -= retval; - } - - /* We check to see if it's an alternate to this one */ - d = (struct usb_interface_descriptor *)buffer; - if (size < USB_DT_INTERFACE_SIZE - || d->bDescriptorType != USB_DT_INTERFACE - || !d->bAlternateSetting) - return parsed; - } - - return parsed; -} - -int usb_parse_configuration(struct usb_host_config *config, unsigned char *buffer) -{ - int i, retval, size; - struct usb_descriptor_header *header; - - memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); - le16_to_cpus(&config->desc.wTotalLength); - size = config->desc.wTotalLength; - - if (config->desc.bNumInterfaces > USB_MAXINTERFACES) { - warn("too many interfaces"); - return -1; - } - - config->interface = (struct usb_interface *) - kmalloc(config->desc.bNumInterfaces * - sizeof(struct usb_interface), GFP_KERNEL); - dbg("kmalloc IF %p, numif %i", config->interface, config->desc.bNumInterfaces); - if (!config->interface) { - err("out of memory"); - return -1; - } - - memset(config->interface, 0, - config->desc.bNumInterfaces * sizeof(struct usb_interface)); - - buffer += config->desc.bLength; - size -= config->desc.bLength; - - config->extra = NULL; - config->extralen = 0; - - for (i = 0; i < config->desc.bNumInterfaces; i++) { - int numskipped, len; - unsigned char *begin; - - /* Skip over the rest of the Class Specific or Vendor */ - /* Specific descriptors */ - begin = buffer; - numskipped = 0; - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if ((header->bLength > size) || (header->bLength < 2)) { - err("invalid descriptor length of %d", header->bLength); - return -1; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header->bDescriptorType == USB_DT_ENDPOINT) || - (header->bDescriptorType == USB_DT_INTERFACE) || - (header->bDescriptorType == USB_DT_CONFIG) || - (header->bDescriptorType == USB_DT_DEVICE)) - break; - - dbg("skipping descriptor 0x%X", header->bDescriptorType); - numskipped++; - - buffer += header->bLength; - size -= header->bLength; - } - if (numskipped) - dbg("skipped %d class/vendor specific endpoint descriptors", numskipped); - - /* Copy any unknown descriptors into a storage area for */ - /* drivers to later parse */ - len = (int)(buffer - begin); - if (len) { - if (config->extralen) { - warn("extra config descriptor"); - } else { - config->extra = kmalloc(len, GFP_KERNEL); - if (!config->extra) { - err("couldn't allocate memory for config extra descriptors"); - config->extralen = 0; - return -1; - } - - memcpy(config->extra, begin, len); - config->extralen = len; - } - } - - retval = usb_parse_interface(config->interface + i, buffer, size); - if (retval < 0) - return retval; - - buffer += retval; - size -= retval; - } - - return size; -} - -// hub-only!! ... and only exported for reset/reinit path. -// otherwise used internally on disconnect/destroy path -void usb_destroy_configuration(struct usb_device *dev) -{ - int c, i, j, k; - - if (!dev->config) - return; - - if (dev->rawdescriptors) { - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) - kfree(dev->rawdescriptors[i]); - - kfree(dev->rawdescriptors); - } - - for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { - struct usb_host_config *cf = &dev->config[c]; - - if (!cf->interface) - break; - - for (i = 0; i < cf->desc.bNumInterfaces; i++) { - struct usb_interface *ifp = - &cf->interface[i]; - - if (!ifp->altsetting) - break; - - for (j = 0; j < ifp->num_altsetting; j++) { - struct usb_host_interface *as = - &ifp->altsetting[j]; - - if(as->extra) { - kfree(as->extra); - } - - if (!as->endpoint) - break; - - for(k = 0; k < as->desc.bNumEndpoints; k++) { - if(as->endpoint[k].extra) { - kfree(as->endpoint[k].extra); - } - } - kfree(as->endpoint); - } - - kfree(ifp->altsetting); - } - kfree(cf->interface); - } - kfree(dev->config); -} - - -// hub-only!! ... and only in reset path, or usb_new_device() -// (used by real hubs and virtual root hubs) -int usb_get_configuration(struct usb_device *dev) -{ - int result; - unsigned int cfgno, length; - unsigned char *buffer; - unsigned char *bigbuffer; - struct usb_config_descriptor *desc; - - if (dev->descriptor.bNumConfigurations > USB_MAXCONFIG) { - warn("too many configurations"); - return -EINVAL; - } - - if (dev->descriptor.bNumConfigurations < 1) { - warn("not enough configurations"); - return -EINVAL; - } - - dev->config = (struct usb_host_config *) - kmalloc(dev->descriptor.bNumConfigurations * - sizeof(struct usb_host_config), GFP_KERNEL); - if (!dev->config) { - err("out of memory"); - return -ENOMEM; - } - memset(dev->config, 0, dev->descriptor.bNumConfigurations * - sizeof(struct usb_host_config)); - - dev->rawdescriptors = (char **)kmalloc(sizeof(char *) * - dev->descriptor.bNumConfigurations, GFP_KERNEL); - if (!dev->rawdescriptors) { - err("out of memory"); - return -ENOMEM; - } - - buffer = kmalloc(8, GFP_KERNEL); - if (!buffer) { - err("unable to allocate memory for configuration descriptors"); - return -ENOMEM; - } - desc = (struct usb_config_descriptor *)buffer; - - for (cfgno = 0; cfgno < dev->descriptor.bNumConfigurations; cfgno++) { - /* We grab the first 8 bytes so we know how long the whole */ - /* configuration is */ - result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8); - if (result < 8) { - if (result < 0) - err("unable to get descriptor"); - else { - err("config descriptor too short (expected %i, got %i)", 8, result); - result = -EINVAL; - } - goto err; - } - - /* Get the full buffer */ - length = le16_to_cpu(desc->wTotalLength); - - bigbuffer = kmalloc(length, GFP_KERNEL); - if (!bigbuffer) { - err("unable to allocate memory for configuration descriptors"); - result = -ENOMEM; - goto err; - } - - /* Now that we know the length, get the whole thing */ - result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, bigbuffer, length); - if (result < 0) { - err("couldn't get all of config descriptors"); - kfree(bigbuffer); - goto err; - } - - if (result < length) { - err("config descriptor too short (expected %i, got %i)", length, result); - result = -EINVAL; - kfree(bigbuffer); - goto err; - } - - dev->rawdescriptors[cfgno] = (char *)bigbuffer; - - result = usb_parse_configuration(&dev->config[cfgno], bigbuffer); - if (result > 0) - dbg("descriptor data left"); - else if (result < 0) { - result = -EINVAL; - goto err; - } - } - - kfree(buffer); - return 0; -err: - kfree(buffer); - dev->descriptor.bNumConfigurations = cfgno; - return result; -} - diff --git a/lib/usb/core/hcd-pci.c b/lib/usb/core/hcd-pci.c deleted file mode 100644 index 9bf8ad455..000000000 --- a/lib/usb/core/hcd-pci.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * (C) Copyright David Brownell 2000-2002 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if 0 -#include - -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif - -#include -#include -#include -#include -#include -#include -#include "hcd.h" -#else -#define DEBUG -#include "../usb_wrapper.h" -#include "hcd.h" -#endif - - -/* PCI-based HCs are normal, but custom bus glue should be ok */ - - -/*-------------------------------------------------------------------------*/ - -/* configure so an HC device and id are always provided */ -/* always called with process context; sleeping is OK */ - -/** - * usb_hcd_pci_probe - initialize PCI-based HCDs - * @dev: USB Host Controller being probed - * @id: pci hotplug id connecting controller to HCD framework - * Context: !in_interrupt() - * - * Allocates basic PCI resources for this USB host controller, and - * then invokes the start() method for the HCD associated with it - * through the hotplug entry's driver_data. - * - * Store this function in the HCD's struct pci_driver as probe(). - */ -int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) -{ - struct hc_driver *driver; - unsigned long resource, len; - void *base; - struct usb_hcd *hcd; - int retval, region; - char buf [8]; - //char *bufp = buf; - - if (usb_disabled()) - return -ENODEV; - - if (!id || !(driver = (struct hc_driver *) id->driver_data)) - return -EINVAL; - - if (pci_enable_device (dev) < 0) - return -ENODEV; - - if (!dev->irq) { - err ("Found HC with no IRQ. Check BIOS/PCI %s setup!", - dev->slot_name); - return -ENODEV; - } - - if (driver->flags & HCD_MEMORY) { // EHCI, OHCI - region = 0; - resource = pci_resource_start (dev, 0); - len = pci_resource_len (dev, 0); - if (!request_mem_region (resource, len, driver->description)) { - dbg ("controller already in use"); - return -EBUSY; - } - base = ioremap_nocache (resource, len); - if (base == NULL) { - dbg ("error mapping memory"); - retval = -EFAULT; -clean_1: - release_mem_region (resource, len); - err ("init %s fail, %d", dev->slot_name, retval); - return retval; - } - - } else { // UHCI - resource = len = 0; - for (region = 0; region < PCI_ROM_RESOURCE; region++) { - if (!(pci_resource_flags (dev, region) & IORESOURCE_IO)) - continue; - - resource = pci_resource_start (dev, region); - len = pci_resource_len (dev, region); - if (request_region (resource, len, - driver->description)) - break; - } - if (region == PCI_ROM_RESOURCE) { - dbg ("no i/o regions available"); - return -EBUSY; - } - base = (void *) resource; - } - - // driver->start(), later on, will transfer device from - // control by SMM/BIOS to control by Linux (if needed) - - pci_set_master (dev); - - hcd = driver->hcd_alloc (); - if (hcd == NULL){ - dbg ("hcd alloc fail"); - retval = -ENOMEM; -clean_2: - if (driver->flags & HCD_MEMORY) { - iounmap (base); - goto clean_1; - } else { - release_region (resource, len); - err ("init %s fail, %d", dev->slot_name, retval); - return retval; - } - } - pci_set_drvdata (dev, hcd); - hcd->driver = driver; - hcd->description = driver->description; - hcd->pdev = dev; - hcd->self.bus_name = dev->slot_name; - hcd->product_desc = dev->dev.name; - hcd->self.controller = &dev->dev; - hcd->controller = hcd->self.controller; - - if ((retval = hcd_buffer_create (hcd)) != 0) { -clean_3: - driver->hcd_free (hcd); - goto clean_2; - } - - dev_info (hcd->controller, "%s\n", hcd->product_desc); - -#ifndef __sparc__ - sprintf (buf, "%d", dev->irq); -#else - bufp = __irq_itoa(dev->irq); -#endif - if (request_irq (dev->irq, usb_hcd_irq, SA_SHIRQ, hcd->description, hcd) - != 0) { - dev_err (hcd->controller, - "request interrupt %s failed\n", bufp); - retval = -EBUSY; - goto clean_3; - } - hcd->irq = dev->irq; - - hcd->regs = base; - hcd->region = region; - dev_info (hcd->controller, "irq %s, %s %p\n", bufp, - (driver->flags & HCD_MEMORY) ? "pci mem" : "io base", - base); - - usb_bus_init (&hcd->self); - hcd->self.op = &usb_hcd_operations; - hcd->self.hcpriv = (void *) hcd; - - INIT_LIST_HEAD (&hcd->dev_list); - - usb_register_bus (&hcd->self); - - if ((retval = driver->start (hcd)) < 0) - usb_hcd_pci_remove (dev); - - return retval; -} -EXPORT_SYMBOL (usb_hcd_pci_probe); - - -/* may be called without controller electrically present */ -/* may be called with controller, bus, and devices active */ - -/** - * usb_hcd_pci_remove - shutdown processing for PCI-based HCDs - * @dev: USB Host Controller being removed - * Context: !in_interrupt() - * - * Reverses the effect of usb_hcd_pci_probe(), first invoking - * the HCD's stop() method. It is always called from a thread - * context, normally "rmmod", "apmd", or something similar. - * - * Store this function in the HCD's struct pci_driver as remove(). - */ -void usb_hcd_pci_remove (struct pci_dev *dev) -{ - struct usb_hcd *hcd; - struct usb_device *hub; - - hcd = pci_get_drvdata(dev); - if (!hcd) - return; - dev_info (hcd->controller, "remove, state %x\n", hcd->state); - - if (in_interrupt ()) - BUG (); - - hub = hcd->self.root_hub; - hcd->state = USB_STATE_QUIESCING; - - dev_dbg (hcd->controller, "roothub graceful disconnect\n"); - usb_disconnect (&hub); - - hcd->driver->stop (hcd); - hcd_buffer_destroy (hcd); - hcd->state = USB_STATE_HALT; - pci_set_drvdata (dev, 0); - - free_irq (hcd->irq, hcd); - if (hcd->driver->flags & HCD_MEMORY) { - iounmap (hcd->regs); - release_mem_region (pci_resource_start (dev, 0), - pci_resource_len (dev, 0)); - } else { - release_region (pci_resource_start (dev, hcd->region), - pci_resource_len (dev, hcd->region)); - } - - usb_deregister_bus (&hcd->self); - if (atomic_read (&hcd->self.refcnt) != 1) { - dev_warn (hcd->controller, - "dangling refs (%d) to bus %d!\n", - atomic_read (&hcd->self.refcnt) - 1, - hcd->self.busnum); - } - hcd->driver->hcd_free (hcd); -} -EXPORT_SYMBOL (usb_hcd_pci_remove); - - -#ifdef CONFIG_PM - -/* - * Some "sleep" power levels imply updating struct usb_driver - * to include a callback asking hcds to do their bit by checking - * if all the drivers can suspend. Gets involved with remote wakeup. - * - * If there are pending urbs, then HCs will need to access memory, - * causing extra power drain. New sleep()/wakeup() PM calls might - * be needed, beyond PCI suspend()/resume(). The root hub timer - * still be accessing memory though ... - * - * FIXME: USB should have some power budgeting support working with - * all kinds of hubs. - * - * FIXME: This assumes only D0->D3 suspend and D3->D0 resume. - * D1 and D2 states should do something, yes? - * - * FIXME: Should provide generic enable_wake(), calling pci_enable_wake() - * for all supported states, so that USB remote wakeup can work for any - * devices that support it (and are connected via powered hubs). - * - * FIXME: resume doesn't seem to work right any more... - */ - - -// 2.4 kernels have issued concurrent resumes (w/APM) -// we defend against that error; PCI doesn't yet. - -/** - * usb_hcd_pci_suspend - power management suspend of a PCI-based HCD - * @dev: USB Host Controller being suspended - * - * Store this function in the HCD's struct pci_driver as suspend(). - */ -int usb_hcd_pci_suspend (struct pci_dev *dev, u32 state) -{ - struct usb_hcd *hcd; - int retval; - - hcd = pci_get_drvdata(dev); - dev_info (hcd->controller, "suspend to state %d\n", state); - - pci_save_state (dev, hcd->pci_state); - - // FIXME for all connected devices, leaf-to-root: - // driver->suspend() - // proposed "new 2.5 driver model" will automate that - - /* driver may want to disable DMA etc */ - retval = hcd->driver->suspend (hcd, state); - hcd->state = USB_STATE_SUSPENDED; - - pci_set_power_state (dev, state); - return retval; -} -EXPORT_SYMBOL (usb_hcd_pci_suspend); - -/** - * usb_hcd_pci_resume - power management resume of a PCI-based HCD - * @dev: USB Host Controller being resumed - * - * Store this function in the HCD's struct pci_driver as resume(). - */ -int usb_hcd_pci_resume (struct pci_dev *dev) -{ - struct usb_hcd *hcd; - int retval; - - hcd = pci_get_drvdata(dev); - dev_info (hcd->controller, "resume\n"); - - /* guard against multiple resumes (APM bug?) */ - atomic_inc (&hcd->resume_count); - if (atomic_read (&hcd->resume_count) != 1) { - dev_err (hcd->controller, "concurrent PCI resumes\n"); - retval = 0; - goto done; - } - - retval = -EBUSY; - if (hcd->state != USB_STATE_SUSPENDED) { - dev_dbg (hcd->controller, "can't resume, not suspended!\n"); - goto done; - } - hcd->state = USB_STATE_RESUMING; - - pci_set_power_state (dev, 0); - pci_restore_state (dev, hcd->pci_state); - - retval = hcd->driver->resume (hcd); - if (!HCD_IS_RUNNING (hcd->state)) { - dev_dbg (hcd->controller, "resume fail, retval %d\n", retval); - usb_hc_died (hcd); -// FIXME: recover, reset etc. - } else { - // FIXME for all connected devices, root-to-leaf: - // driver->resume (); - // proposed "new 2.5 driver model" will automate that - } - -done: - atomic_dec (&hcd->resume_count); - return retval; -} -EXPORT_SYMBOL (usb_hcd_pci_resume); - -#endif /* CONFIG_PM */ - - diff --git a/lib/usb/core/hcd.c b/lib/usb/core/hcd.c deleted file mode 100644 index 7b31c0c97..000000000 --- a/lib/usb/core/hcd.c +++ /dev/null @@ -1,1512 +0,0 @@ -/* - * (C) Copyright Linus Torvalds 1999 - * (C) Copyright Johannes Erdfelt 1999-2001 - * (C) Copyright Andreas Gal 1999 - * (C) Copyright Gregory P. Smith 1999 - * (C) Copyright Deti Fliegl 1999 - * (C) Copyright Randy Dunlap 2000 - * (C) Copyright David Brownell 2000-2002 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if 0 -#include - -#ifdef CONFIG_USB_DEBUG -#define DEBUG -#endif - -#include -#include -#include -#include -#include -#include /* for UTS_SYSNAME */ -#include /* for hcd->pdev and dma addressing */ -#include -#include - -#include -#else -#include "../usb_wrapper.h" -//#define DEBUG -#endif - -#include "hcd.h" - -// #define USB_BANDWIDTH_MESSAGES - -/*-------------------------------------------------------------------------*/ - -/* - * USB Host Controller Driver framework - * - * Plugs into usbcore (usb_bus) and lets HCDs share code, minimizing - * HCD-specific behaviors/bugs. - * - * This does error checks, tracks devices and urbs, and delegates to a - * "hc_driver" only for code (and data) that really needs to know about - * hardware differences. That includes root hub registers, i/o queues, - * and so on ... but as little else as possible. - * - * Shared code includes most of the "root hub" code (these are emulated, - * though each HC's hardware works differently) and PCI glue, plus request - * tracking overhead. The HCD code should only block on spinlocks or on - * hardware handshaking; blocking on software events (such as other kernel - * threads releasing resources, or completing actions) is all generic. - * - * Happens the USB 2.0 spec says this would be invisible inside the "USBD", - * and includes mostly a "HCDI" (HCD Interface) along with some APIs used - * only by the hub driver ... and that neither should be seen or used by - * usb client device drivers. - * - * Contributors of ideas or unattributed patches include: David Brownell, - * Roman Weissgaerber, Rory Bolt, Greg Kroah-Hartman, ... - * - * HISTORY: - * 2002-02-21 Pull in most of the usb_bus support from usb.c; some - * associated cleanup. "usb_hcd" still != "usb_bus". - * 2001-12-12 Initial patch version for Linux 2.5.1 kernel. - */ - -/*-------------------------------------------------------------------------*/ - -/* host controllers we manage */ -LIST_HEAD (usb_bus_list); -EXPORT_SYMBOL_GPL (usb_bus_list); - -/* used when allocating bus numbers */ -#define USB_MAXBUS 64 -struct usb_busmap { - unsigned long busmap [USB_MAXBUS / (8*sizeof (unsigned long))]; -}; -static struct usb_busmap busmap; - -/* used when updating list of hcds */ -DECLARE_MUTEX (usb_bus_list_lock); /* exported only for usbfs */ -EXPORT_SYMBOL_GPL (usb_bus_list_lock); - -/* used when updating hcd data */ -static spinlock_t hcd_data_lock = SPIN_LOCK_UNLOCKED; - -/*-------------------------------------------------------------------------*/ - -/* - * Sharable chunks of root hub code. - */ - -/*-------------------------------------------------------------------------*/ - -#define KERNEL_REL ((LINUX_VERSION_CODE >> 16) & 0x0ff) -#define KERNEL_VER ((LINUX_VERSION_CODE >> 8) & 0x0ff) - -/* usb 2.0 root hub device descriptor */ -static const u8 usb2_rh_dev_descriptor [18] = { - 0x12, /* __u8 bLength; */ - 0x01, /* __u8 bDescriptorType; Device */ - 0x00, 0x02, /* __u16 bcdUSB; v2.0 */ - - 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */ - 0x00, /* __u8 bDeviceSubClass; */ - 0x01, /* __u8 bDeviceProtocol; [ usb 2.0 single TT ]*/ - 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */ - - 0x00, 0x00, /* __u16 idVendor; */ - 0x00, 0x00, /* __u16 idProduct; */ - KERNEL_VER, KERNEL_REL, /* __u16 bcdDevice */ - - 0x03, /* __u8 iManufacturer; */ - 0x02, /* __u8 iProduct; */ - 0x01, /* __u8 iSerialNumber; */ - 0x01 /* __u8 bNumConfigurations; */ -}; - -/* no usb 2.0 root hub "device qualifier" descriptor: one speed only */ - -/* usb 1.1 root hub device descriptor */ -static const u8 usb11_rh_dev_descriptor [18] = { - 0x12, /* __u8 bLength; */ - 0x01, /* __u8 bDescriptorType; Device */ - 0x10, 0x01, /* __u16 bcdUSB; v1.1 */ - - 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */ - 0x00, /* __u8 bDeviceSubClass; */ - 0x00, /* __u8 bDeviceProtocol; [ low/full speeds only ] */ - 0x08, /* __u8 bMaxPacketSize0; 8 Bytes */ - - 0x00, 0x00, /* __u16 idVendor; */ - 0x00, 0x00, /* __u16 idProduct; */ - KERNEL_VER, KERNEL_REL, /* __u16 bcdDevice */ - - 0x03, /* __u8 iManufacturer; */ - 0x02, /* __u8 iProduct; */ - 0x01, /* __u8 iSerialNumber; */ - 0x01 /* __u8 bNumConfigurations; */ -}; - - -/*-------------------------------------------------------------------------*/ - -/* Configuration descriptors for our root hubs */ - -static const u8 fs_rh_config_descriptor [] = { - - /* one configuration */ - 0x09, /* __u8 bLength; */ - 0x02, /* __u8 bDescriptorType; Configuration */ - 0x19, 0x00, /* __u16 wTotalLength; */ - 0x01, /* __u8 bNumInterfaces; (1) */ - 0x01, /* __u8 bConfigurationValue; */ - 0x00, /* __u8 iConfiguration; */ - 0x40, /* __u8 bmAttributes; - Bit 7: Bus-powered, - 6: Self-powered, - 5 Remote-wakwup, - 4..0: resvd */ - 0x00, /* __u8 MaxPower; */ - - /* USB 1.1: - * USB 2.0, single TT organization (mandatory): - * one interface, protocol 0 - * - * USB 2.0, multiple TT organization (optional): - * two interfaces, protocols 1 (like single TT) - * and 2 (multiple TT mode) ... config is - * sometimes settable - * NOT IMPLEMENTED - */ - - /* one interface */ - 0x09, /* __u8 if_bLength; */ - 0x04, /* __u8 if_bDescriptorType; Interface */ - 0x00, /* __u8 if_bInterfaceNumber; */ - 0x00, /* __u8 if_bAlternateSetting; */ - 0x01, /* __u8 if_bNumEndpoints; */ - 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */ - 0x00, /* __u8 if_bInterfaceSubClass; */ - 0x00, /* __u8 if_bInterfaceProtocol; [usb1.1 or single tt] */ - 0x00, /* __u8 if_iInterface; */ - - /* one endpoint (status change endpoint) */ - 0x07, /* __u8 ep_bLength; */ - 0x05, /* __u8 ep_bDescriptorType; Endpoint */ - 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ - 0x03, /* __u8 ep_bmAttributes; Interrupt */ - 0x02, 0x00, /* __u16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ - 0xff /* __u8 ep_bInterval; (255ms -- usb 2.0 spec) */ -}; - -static const u8 hs_rh_config_descriptor [] = { - - /* one configuration */ - 0x09, /* __u8 bLength; */ - 0x02, /* __u8 bDescriptorType; Configuration */ - 0x19, 0x00, /* __u16 wTotalLength; */ - 0x01, /* __u8 bNumInterfaces; (1) */ - 0x01, /* __u8 bConfigurationValue; */ - 0x00, /* __u8 iConfiguration; */ - 0x40, /* __u8 bmAttributes; - Bit 7: Bus-powered, - 6: Self-powered, - 5 Remote-wakwup, - 4..0: resvd */ - 0x00, /* __u8 MaxPower; */ - - /* USB 1.1: - * USB 2.0, single TT organization (mandatory): - * one interface, protocol 0 - * - * USB 2.0, multiple TT organization (optional): - * two interfaces, protocols 1 (like single TT) - * and 2 (multiple TT mode) ... config is - * sometimes settable - * NOT IMPLEMENTED - */ - - /* one interface */ - 0x09, /* __u8 if_bLength; */ - 0x04, /* __u8 if_bDescriptorType; Interface */ - 0x00, /* __u8 if_bInterfaceNumber; */ - 0x00, /* __u8 if_bAlternateSetting; */ - 0x01, /* __u8 if_bNumEndpoints; */ - 0x09, /* __u8 if_bInterfaceClass; HUB_CLASSCODE */ - 0x00, /* __u8 if_bInterfaceSubClass; */ - 0x00, /* __u8 if_bInterfaceProtocol; [usb1.1 or single tt] */ - 0x00, /* __u8 if_iInterface; */ - - /* one endpoint (status change endpoint) */ - 0x07, /* __u8 ep_bLength; */ - 0x05, /* __u8 ep_bDescriptorType; Endpoint */ - 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ - 0x03, /* __u8 ep_bmAttributes; Interrupt */ - 0x02, 0x00, /* __u16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ - 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */ -}; - -/*-------------------------------------------------------------------------*/ - -/* - * helper routine for returning string descriptors in UTF-16LE - * input can actually be ISO-8859-1; ASCII is its 7-bit subset - */ -static int ascii2utf (char *s, u8 *utf, int utfmax) -{ - int retval; - - for (retval = 0; *s && utfmax > 1; utfmax -= 2, retval += 2) { - *utf++ = *s++; - *utf++ = 0; - } - return retval; -} - -/* - * rh_string - provides manufacturer, product and serial strings for root hub - * @id: the string ID number (1: serial number, 2: product, 3: vendor) - * @hcd: the host controller for this root hub - * @type: string describing our driver - * @data: return packet in UTF-16 LE - * @len: length of the return packet - * - * Produces either a manufacturer, product or serial number string for the - * virtual root hub device. - */ -static int rh_string ( - int id, - struct usb_hcd *hcd, - u8 *data, - int len -) { - char buf [100]; - - // language ids - if (id == 0) { - *data++ = 4; *data++ = 3; /* 4 bytes string data */ - *data++ = 0x09; *data++ = 0x04; /* MSFT-speak for "en-us" */ - return 4; - - // serial number - } else if (id == 1) { - strcpy (buf, hcd->self.bus_name); - - // product description - } else if (id == 2) { - strcpy (buf, hcd->product_desc); - - // id 3 == vendor description - } else if (id == 3) { - sprintf (buf, "%s %s %s", UTS_SYSNAME, UTS_RELEASE, - hcd->description); - - // unsupported IDs --> "protocol stall" - } else - return 0; - - data [0] = 2 * (strlen (buf) + 1); - data [1] = 3; /* type == string */ - return 2 + ascii2utf (buf, data + 2, len - 2); -} - - -/* Root hub control transfers execute synchronously */ -static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) -{ - struct usb_ctrlrequest *cmd = (struct usb_ctrlrequest *) urb->setup_packet; - u16 typeReq, wValue, wIndex, wLength; - const u8 *bufp = 0; - u8 *ubuf = urb->transfer_buffer; - int len = 0; - //unsigned long flags; - - typeReq = (cmd->bRequestType << 8) | cmd->bRequest; - wValue = le16_to_cpu (cmd->wValue); - wIndex = le16_to_cpu (cmd->wIndex); - wLength = le16_to_cpu (cmd->wLength); - - if (wLength > urb->transfer_buffer_length) - goto error; - - /* set up for success */ - urb->status = 0; - urb->actual_length = wLength; - switch (typeReq) { - - /* DEVICE REQUESTS */ - - case DeviceRequest | USB_REQ_GET_STATUS: - // DEVICE_REMOTE_WAKEUP - ubuf [0] = 1; // selfpowered - ubuf [1] = 0; - /* FALLTHROUGH */ - case DeviceOutRequest | USB_REQ_CLEAR_FEATURE: - case DeviceOutRequest | USB_REQ_SET_FEATURE: - dev_dbg (hcd->controller, "no device features yet yet\n"); - break; - case DeviceRequest | USB_REQ_GET_CONFIGURATION: - ubuf [0] = 1; - /* FALLTHROUGH */ - case DeviceOutRequest | USB_REQ_SET_CONFIGURATION: - break; - case DeviceRequest | USB_REQ_GET_DESCRIPTOR: - switch (wValue & 0xff00) { - case USB_DT_DEVICE << 8: - if (hcd->driver->flags & HCD_USB2) - bufp = usb2_rh_dev_descriptor; - else if (hcd->driver->flags & HCD_USB11) - bufp = usb11_rh_dev_descriptor; - else - goto error; - len = 18; - break; - case USB_DT_CONFIG << 8: - if (hcd->driver->flags & HCD_USB2) { - bufp = hs_rh_config_descriptor; - len = sizeof hs_rh_config_descriptor; - } else { - bufp = fs_rh_config_descriptor; - len = sizeof fs_rh_config_descriptor; - } - break; - case USB_DT_STRING << 8: - urb->actual_length = rh_string ( - wValue & 0xff, hcd, - ubuf, wLength); - break; - default: - goto error; - } - break; - case DeviceRequest | USB_REQ_GET_INTERFACE: - ubuf [0] = 0; - /* FALLTHROUGH */ - case DeviceOutRequest | USB_REQ_SET_INTERFACE: - break; - case DeviceOutRequest | USB_REQ_SET_ADDRESS: - // wValue == urb->dev->devaddr - dev_dbg (hcd->controller, "root hub device address %d\n", - wValue); - break; - - /* INTERFACE REQUESTS (no defined feature/status flags) */ - - /* ENDPOINT REQUESTS */ - - case EndpointRequest | USB_REQ_GET_STATUS: - // ENDPOINT_HALT flag - ubuf [0] = 0; - ubuf [1] = 0; - /* FALLTHROUGH */ - case EndpointOutRequest | USB_REQ_CLEAR_FEATURE: - case EndpointOutRequest | USB_REQ_SET_FEATURE: - dev_dbg (hcd->controller, "no endpoint features yet\n"); - break; - - /* CLASS REQUESTS (and errors) */ - - default: - /* non-generic request */ - urb->status = hcd->driver->hub_control (hcd, - typeReq, wValue, wIndex, - (char *)ubuf, wLength); - break; -error: - /* "protocol stall" on error */ - urb->status = -EPIPE; - dev_dbg (hcd->controller, "unsupported hub control message (maxchild %d)\n", - urb->dev->maxchild); - } - if (urb->status) { - urb->actual_length = 0; - dev_dbg (hcd->controller, "CTRL: TypeReq=0x%x val=0x%x idx=0x%x len=%d ==> %d\n", - typeReq, wValue, wIndex, wLength, urb->status); - } - if (bufp) { - if (urb->transfer_buffer_length < len) - len = urb->transfer_buffer_length; - urb->actual_length = len; - // always USB_DIR_IN, toward host - memcpy (ubuf, bufp, len); - } - - /* any errors get returned through the urb completion */ - local_irq_save (flags); - usb_hcd_giveback_urb (hcd, urb, NULL); - local_irq_restore (flags); - return 0; -} - -/*-------------------------------------------------------------------------*/ - -/* - * Root Hub interrupt transfers are synthesized with a timer. - * Completions are called in_interrupt() but not in_irq(). - */ - -static void rh_report_status (unsigned long ptr); - -static int rh_status_urb (struct usb_hcd *hcd, struct urb *urb) -{ - int len = 1 + (urb->dev->maxchild / 8); - - /* rh_timer protected by hcd_data_lock */ - if (hcd->rh_timer.data - || urb->status != -EINPROGRESS - || urb->transfer_buffer_length < len) { - dev_dbg (hcd->controller, - "not queuing rh status urb, stat %d\n", - urb->status); - return -EINVAL; - } - - init_timer (&hcd->rh_timer); - - hcd->rh_timer.function = rh_report_status; - hcd->rh_timer.data = (unsigned long) urb; - /* USB 2.0 spec says 256msec; this is close enough */ - hcd->rh_timer.expires = jiffies + HZ/4; - add_timer (&hcd->rh_timer); - urb->hcpriv = hcd; /* nonzero to indicate it's queued */ - return 0; -} - -/* timer callback */ - -static void rh_report_status (unsigned long ptr) -{ - struct urb *urb; - struct usb_hcd *hcd; - int length; - //unsigned long flags; - - urb = (struct urb *) ptr; - local_irq_save (flags); - spin_lock (&urb->lock); - - /* do nothing if the hc is gone or the urb's been unlinked */ - if (!urb->dev - || urb->status != -EINPROGRESS - || (hcd = urb->dev->bus->hcpriv) == 0 - || !HCD_IS_RUNNING (hcd->state)) { - spin_unlock (&urb->lock); - local_irq_restore (flags); - return; - } - - length = hcd->driver->hub_status_data (hcd, urb->transfer_buffer); - - /* complete the status urb, or retrigger the timer */ - spin_lock (&hcd_data_lock); - if (length > 0) { - hcd->rh_timer.data = 0; - urb->actual_length = length; - urb->status = 0; - urb->hcpriv = 0; - } else - mod_timer (&hcd->rh_timer, jiffies + HZ/4); - spin_unlock (&hcd_data_lock); - spin_unlock (&urb->lock); - - /* local irqs are always blocked in completions */ - if (length > 0) - usb_hcd_giveback_urb (hcd, urb, NULL); - local_irq_restore (flags); -} - -/*-------------------------------------------------------------------------*/ - -static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb) -{ - if (usb_pipeint (urb->pipe)) { - int retval; - unsigned long flags; - - spin_lock_irqsave (&hcd_data_lock, flags); - retval = rh_status_urb (hcd, urb); - spin_unlock_irqrestore (&hcd_data_lock, flags); - return retval; - } - if (usb_pipecontrol (urb->pipe)) - return rh_call_control (hcd, urb); - else - return -EINVAL; -} - -/*-------------------------------------------------------------------------*/ - -void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb) -{ - //unsigned long flags; - - /* note: always a synchronous unlink */ - del_timer_sync (&hcd->rh_timer); - hcd->rh_timer.data = 0; - - local_irq_save (flags); - urb->hcpriv = 0; - usb_hcd_giveback_urb (hcd, urb, NULL); - local_irq_restore (flags); -} - -/*-------------------------------------------------------------------------*/ - -/* exported only within usbcore */ -void usb_bus_get (struct usb_bus *bus) -{ - atomic_inc (&bus->refcnt); -} - -/* exported only within usbcore */ -void usb_bus_put (struct usb_bus *bus) -{ - if (atomic_dec_and_test (&bus->refcnt)) - kfree (bus); -} - -/*-------------------------------------------------------------------------*/ - -/** - * usb_bus_init - shared initialization code - * @bus: the bus structure being initialized - * - * This code is used to initialize a usb_bus structure, memory for which is - * separately managed. - */ -void usb_bus_init (struct usb_bus *bus) -{ - memset (&bus->devmap, 0, sizeof(struct usb_devmap)); - - bus->devnum_next = 1; - - bus->root_hub = NULL; - bus->hcpriv = NULL; - bus->busnum = -1; - bus->bandwidth_allocated = 0; - bus->bandwidth_int_reqs = 0; - bus->bandwidth_isoc_reqs = 0; - - INIT_LIST_HEAD (&bus->bus_list); - - atomic_set (&bus->refcnt, 1); -} -EXPORT_SYMBOL (usb_bus_init); - -/** - * usb_alloc_bus - creates a new USB host controller structure - * @op: pointer to a struct usb_operations that this bus structure should use - * Context: !in_interrupt() - * - * Creates a USB host controller bus structure with the specified - * usb_operations and initializes all the necessary internal objects. - * - * If no memory is available, NULL is returned. - * - * The caller should call usb_free_bus() when it is finished with the structure. - */ -struct usb_bus *usb_alloc_bus (struct usb_operations *op) -{ - struct usb_bus *bus; - - bus = kmalloc (sizeof *bus, GFP_KERNEL); - if (!bus) - return NULL; - usb_bus_init (bus); - bus->op = op; - return bus; -} -EXPORT_SYMBOL (usb_alloc_bus); - -/** - * usb_free_bus - frees the memory used by a bus structure - * @bus: pointer to the bus to free - * - * To be invoked by a HCD, only as the last step of decoupling from - * hardware. It is an error to call this if the reference count is - * anything but one. That would indicate that some system component - * did not correctly shut down, and thought the hardware was still - * accessible. - */ -void usb_free_bus (struct usb_bus *bus) -{ - if (!bus) - return; - if (atomic_read (&bus->refcnt) != 1) - err ("usb_free_bus #%d, count != 1", bus->busnum); - usb_bus_put (bus); -} -EXPORT_SYMBOL (usb_free_bus); - -/*-------------------------------------------------------------------------*/ - -/** - * usb_register_bus - registers the USB host controller with the usb core - * @bus: pointer to the bus to register - * Context: !in_interrupt() - * - * Assigns a bus number, and links the controller into usbcore data - * structures so that it can be seen by scanning the bus list. - */ -void usb_register_bus(struct usb_bus *bus) -{ - int busnum; - - down (&usb_bus_list_lock); - busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1); - if (busnum < USB_MAXBUS) { - set_bit (busnum, busmap.busmap); - bus->busnum = busnum; - } else - warn ("too many buses"); - - usb_bus_get (bus); - - /* Add it to the list of buses */ - list_add (&bus->bus_list, &usb_bus_list); - up (&usb_bus_list_lock); - - usbfs_add_bus (bus); - - dev_info (bus->controller, "new USB bus registered, assigned bus number %d\n", bus->busnum); -} -EXPORT_SYMBOL (usb_register_bus); - -/** - * usb_deregister_bus - deregisters the USB host controller - * @bus: pointer to the bus to deregister - * Context: !in_interrupt() - * - * Recycles the bus number, and unlinks the controller from usbcore data - * structures so that it won't be seen by scanning the bus list. - */ -void usb_deregister_bus (struct usb_bus *bus) -{ - dev_info (bus->controller, "USB bus %d deregistered\n", bus->busnum); - - /* - * NOTE: make sure that all the devices are removed by the - * controller code, as well as having it call this when cleaning - * itself up - */ - down (&usb_bus_list_lock); - list_del (&bus->bus_list); - up (&usb_bus_list_lock); - - usbfs_remove_bus (bus); - - clear_bit (bus->busnum, busmap.busmap); - - usb_bus_put (bus); -} -EXPORT_SYMBOL (usb_deregister_bus); - -/** - * usb_register_root_hub - called by HCD to register its root hub - * @usb_dev: the usb root hub device to be registered. - * @parent_dev: the parent device of this root hub. - * - * The USB host controller calls this function to register the root hub - * properly with the USB subsystem. It sets up the device properly in - * the driverfs tree, and then calls usb_new_device() to register the - * usb device. - */ -int usb_register_root_hub (struct usb_device *usb_dev, struct device *parent_dev) -{ - int retval; - - sprintf (&usb_dev->dev.bus_id[0], "usb%d", usb_dev->bus->busnum); - usb_dev->state = USB_STATE_DEFAULT; - retval = usb_new_device (usb_dev, parent_dev); - if (retval) - dev_err (parent_dev, "can't register root hub for %s, %d\n", - usb_dev->dev.bus_id, retval); - return retval; -} -EXPORT_SYMBOL (usb_register_root_hub); - - -/*-------------------------------------------------------------------------*/ - -/** - * usb_calc_bus_time - approximate periodic transaction time in nanoseconds - * @speed: from dev->speed; USB_SPEED_{LOW,FULL,HIGH} - * @is_input: true iff the transaction sends data to the host - * @isoc: true for isochronous transactions, false for interrupt ones - * @bytecount: how many bytes in the transaction. - * - * Returns approximate bus time in nanoseconds for a periodic transaction. - * See USB 2.0 spec section 5.11.3; only periodic transfers need to be - * scheduled in software, this function is only used for such scheduling. - */ -long usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount) -{ - unsigned long tmp; - - switch (speed) { - case USB_SPEED_LOW: /* INTR only */ - if (is_input) { - tmp = (67667L * (31L + 10L * BitTime (bytecount))) / 1000L; - return (64060L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp); - } else { - tmp = (66700L * (31L + 10L * BitTime (bytecount))) / 1000L; - return (64107L + (2 * BW_HUB_LS_SETUP) + BW_HOST_DELAY + tmp); - } - case USB_SPEED_FULL: /* ISOC or INTR */ - if (isoc) { - tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L; - return (((is_input) ? 7268L : 6265L) + BW_HOST_DELAY + tmp); - } else { - tmp = (8354L * (31L + 10L * BitTime (bytecount))) / 1000L; - return (9107L + BW_HOST_DELAY + tmp); - } - case USB_SPEED_HIGH: /* ISOC or INTR */ - // FIXME adjust for input vs output - if (isoc) - tmp = HS_USECS (bytecount); - else - tmp = HS_USECS_ISO (bytecount); - return tmp; - default: - dbg ("bogus device speed!"); - return -1; - } -} -EXPORT_SYMBOL (usb_calc_bus_time); - -/* - * usb_check_bandwidth(): - * - * old_alloc is from host_controller->bandwidth_allocated in microseconds; - * bustime is from calc_bus_time(), but converted to microseconds. - * - * returns if successful, - * or -ENOSPC if bandwidth request fails. - * - * FIXME: - * This initial implementation does not use Endpoint.bInterval - * in managing bandwidth allocation. - * It probably needs to be expanded to use Endpoint.bInterval. - * This can be done as a later enhancement (correction). - * - * This will also probably require some kind of - * frame allocation tracking...meaning, for example, - * that if multiple drivers request interrupts every 10 USB frames, - * they don't all have to be allocated at - * frame numbers N, N+10, N+20, etc. Some of them could be at - * N+11, N+21, N+31, etc., and others at - * N+12, N+22, N+32, etc. - * - * Similarly for isochronous transfers... - * - * Individual HCDs can schedule more directly ... this logic - * is not correct for high speed transfers. - */ -int usb_check_bandwidth (struct usb_device *dev, struct urb *urb) -{ - unsigned int pipe = urb->pipe; - long bustime; - int is_in = usb_pipein (pipe); - int is_iso = usb_pipeisoc (pipe); - int old_alloc = dev->bus->bandwidth_allocated; - int new_alloc; - - - bustime = NS_TO_US (usb_calc_bus_time (dev->speed, is_in, is_iso, - usb_maxpacket (dev, pipe, !is_in))); - if (is_iso) - bustime /= urb->number_of_packets; - - new_alloc = old_alloc + (int) bustime; - if (new_alloc > FRAME_TIME_MAX_USECS_ALLOC) { -#ifdef DEBUG - char *mode = -#ifdef CONFIG_USB_BANDWIDTH - ""; -#else - "would have "; -#endif - dev_dbg (&dev->dev, "usb_check_bandwidth %sFAILED: %d + %ld = %d usec\n", - mode, old_alloc, bustime, new_alloc); -#endif -#ifdef CONFIG_USB_BANDWIDTH - bustime = -ENOSPC; /* report error */ -#endif - } - - return bustime; -} -EXPORT_SYMBOL (usb_check_bandwidth); - - -/** - * usb_claim_bandwidth - records bandwidth for a periodic transfer - * @dev: source/target of request - * @urb: request (urb->dev == dev) - * @bustime: bandwidth consumed, in (average) microseconds per frame - * @isoc: true iff the request is isochronous - * - * Bus bandwidth reservations are recorded purely for diagnostic purposes. - * HCDs are expected not to overcommit periodic bandwidth, and to record such - * reservations whenever endpoints are added to the periodic schedule. - * - * FIXME averaging per-frame is suboptimal. Better to sum over the HCD's - * entire periodic schedule ... 32 frames for OHCI, 1024 for UHCI, settable - * for EHCI (256/512/1024 frames, default 1024) and have the bus expose how - * large its periodic schedule is. - */ -void usb_claim_bandwidth (struct usb_device *dev, struct urb *urb, int bustime, int isoc) -{ - dev->bus->bandwidth_allocated += bustime; - if (isoc) - dev->bus->bandwidth_isoc_reqs++; - else - dev->bus->bandwidth_int_reqs++; - urb->bandwidth = bustime; - -#ifdef USB_BANDWIDTH_MESSAGES - dev_dbg (&dev->dev, "bandwidth alloc increased by %d (%s) to %d for %d requesters\n", - bustime, - isoc ? "ISOC" : "INTR", - dev->bus->bandwidth_allocated, - dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs); -#endif -} -EXPORT_SYMBOL (usb_claim_bandwidth); - - -/** - * usb_release_bandwidth - reverses effect of usb_claim_bandwidth() - * @dev: source/target of request - * @urb: request (urb->dev == dev) - * @isoc: true iff the request is isochronous - * - * This records that previously allocated bandwidth has been released. - * Bandwidth is released when endpoints are removed from the host controller's - * periodic schedule. - */ -void usb_release_bandwidth (struct usb_device *dev, struct urb *urb, int isoc) -{ - dev->bus->bandwidth_allocated -= urb->bandwidth; - if (isoc) - dev->bus->bandwidth_isoc_reqs--; - else - dev->bus->bandwidth_int_reqs--; - -#ifdef USB_BANDWIDTH_MESSAGES - dev_dbg (&dev->dev, "bandwidth alloc reduced by %d (%s) to %d for %d requesters\n", - urb->bandwidth, - isoc ? "ISOC" : "INTR", - dev->bus->bandwidth_allocated, - dev->bus->bandwidth_int_reqs + dev->bus->bandwidth_isoc_reqs); -#endif - urb->bandwidth = 0; -} -EXPORT_SYMBOL (usb_release_bandwidth); - - -/*-------------------------------------------------------------------------*/ - -/* - * Generic HC operations. - */ - -/*-------------------------------------------------------------------------*/ - -/* called from khubd, or root hub init threads for hcd-private init */ -static int hcd_alloc_dev (struct usb_device *udev) -{ - struct hcd_dev *dev; - struct usb_hcd *hcd; - unsigned long flags; - - if (!udev || udev->hcpriv) - return -EINVAL; - if (!udev->bus || !udev->bus->hcpriv) - return -ENODEV; - hcd = udev->bus->hcpriv; - if (hcd->state == USB_STATE_QUIESCING) - return -ENOLINK; - - dev = (struct hcd_dev *) kmalloc (sizeof *dev, GFP_KERNEL); - if (dev == NULL) - return -ENOMEM; - memset (dev, 0, sizeof *dev); - - INIT_LIST_HEAD (&dev->dev_list); - INIT_LIST_HEAD (&dev->urb_list); - - spin_lock_irqsave (&hcd_data_lock, flags); - list_add (&dev->dev_list, &hcd->dev_list); - // refcount is implicit - udev->hcpriv = dev; - spin_unlock_irqrestore (&hcd_data_lock, flags); - - return 0; -} - -/*-------------------------------------------------------------------------*/ - -static void urb_unlink (struct urb *urb) -{ - unsigned long flags; - struct usb_device *dev; - - /* Release any periodic transfer bandwidth */ - if (urb->bandwidth) - usb_release_bandwidth (urb->dev, urb, - usb_pipeisoc (urb->pipe)); - - /* clear all state linking urb to this dev (and hcd) */ - - spin_lock_irqsave (&hcd_data_lock, flags); - list_del_init (&urb->urb_list); - dev = urb->dev; - spin_unlock_irqrestore (&hcd_data_lock, flags); - usb_put_dev (dev); -} - - -/* may be called in any context with a valid urb->dev usecount - * caller surrenders "ownership" of urb - * expects usb_submit_urb() to have sanity checked and conditioned all - * inputs in the urb - */ -static int hcd_submit_urb (struct urb *urb, int mem_flags) -{ - int status; - struct usb_hcd *hcd = urb->dev->bus->hcpriv; - struct hcd_dev *dev = urb->dev->hcpriv; - unsigned long flags; - - - if (!hcd || !dev) - return -ENODEV; -// printk("submit_urb %p, # %i, t %i\n",urb,urb->dev->devnum,usb_pipetype(urb->pipe)); - /* - * FIXME: make urb timeouts be generic, keeping the HCD cores - * as simple as possible. - */ - - // NOTE: a generic device/urb monitoring hook would go here. - // hcd_monitor_hook(MONITOR_URB_SUBMIT, urb) - // It would catch submission paths for all urbs. - - /* - * Atomically queue the urb, first to our records, then to the HCD. - * Access to urb->status is controlled by urb->lock ... changes on - * i/o completion (normal or fault) or unlinking. - */ - - // FIXME: verify that quiescing hc works right (RH cleans up) - - spin_lock_irqsave (&hcd_data_lock, flags); - if (HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_QUIESCING) { - usb_get_dev (urb->dev); - list_add_tail (&urb->urb_list, &dev->urb_list); - status = 0; - } else { - INIT_LIST_HEAD (&urb->urb_list); - status = -ESHUTDOWN; - } - spin_unlock_irqrestore (&hcd_data_lock, flags); - if (status) - return status; - - /* increment urb's reference count as part of giving it to the HCD - * (which now controls it). HCD guarantees that it either returns - * an error or calls giveback(), but not both. - */ - - urb = usb_get_urb (urb); - if (urb->dev == hcd->self.root_hub) { - /* NOTE: requirement on hub callers (usbfs and the hub - * driver, for now) that URBs' urb->transfer_buffer be - * valid and usb_buffer_{sync,unmap}() not be needed, since - * they could clobber root hub response data. - */ - urb->transfer_flags |= URB_NO_DMA_MAP; - status = rh_urb_enqueue (hcd, urb); - goto done; - } - - /* lower level hcd code should use *_dma exclusively, - * unless it uses pio or talks to another transport. - */ - if (!(urb->transfer_flags & URB_NO_DMA_MAP) - && hcd->controller->dma_mask) { - if (usb_pipecontrol (urb->pipe)) - urb->setup_dma = dma_map_single ( - hcd->controller, - urb->setup_packet, - sizeof (struct usb_ctrlrequest), - DMA_TO_DEVICE); - if (urb->transfer_buffer_length != 0) - urb->transfer_dma = dma_map_single ( - hcd->controller, - urb->transfer_buffer, - urb->transfer_buffer_length, - usb_pipein (urb->pipe) - ? DMA_FROM_DEVICE - : DMA_TO_DEVICE); - } - - status = hcd->driver->urb_enqueue (hcd, urb, mem_flags); -done: - if (status) { - usb_put_urb (urb); - urb_unlink (urb); - } - return status; -} - -/*-------------------------------------------------------------------------*/ - -/* called in any context */ -static int hcd_get_frame_number (struct usb_device *udev) -{ - struct usb_hcd *hcd = (struct usb_hcd *)udev->bus->hcpriv; - return hcd->driver->get_frame_number (hcd); -} - -/*-------------------------------------------------------------------------*/ - -/* this makes the hcd giveback() the urb more quickly, by kicking it - * off hardware queues (which may take a while) and returning it as - * soon as practical. we've already set up the urb's return status, - * but we can't know if the callback completed already. - */ -static void -unlink1 (struct usb_hcd *hcd, struct urb *urb) -{ - if (urb == (struct urb *) hcd->rh_timer.data) - usb_rh_status_dequeue (hcd, urb); - else { - int value; - - /* failures "should" be harmless */ - value = hcd->driver->urb_dequeue (hcd, urb); - if (value != 0) - dev_dbg (hcd->controller, - "dequeue %p --> %d\n", - urb, value); - } -} - -struct completion_splice { // modified urb context: - /* did we complete? */ - struct completion done; - - /* original urb data */ - usb_complete_t complete; - void *context; -}; - -static void unlink_complete (struct urb *urb, struct pt_regs *regs) -{ - struct completion_splice *splice; - - splice = (struct completion_splice *) urb->context; - - /* issue original completion call */ - urb->complete = splice->complete; - urb->context = splice->context; - urb->complete (urb, regs); - - /* then let the synchronous unlink call complete */ - complete (&splice->done); -} - -/* - * called in any context; note ASYNC_UNLINK restrictions - * - * caller guarantees urb won't be recycled till both unlink() - * and the urb's completion function return - */ -static int hcd_unlink_urb (struct urb *urb) -{ - struct hcd_dev *dev; - struct usb_hcd *hcd = 0; - struct device *sys = 0; - unsigned long flags; - struct completion_splice splice; - int retval; - - if (!urb) - return -EINVAL; - - /* - * we contend for urb->status with the hcd core, - * which changes it while returning the urb. - * - * Caller guaranteed that the urb pointer hasn't been freed, and - * that it was submitted. But as a rule it can't know whether or - * not it's already been unlinked ... so we respect the reversed - * lock sequence needed for the usb_hcd_giveback_urb() code paths - * (urb lock, then hcd_data_lock) in case some other CPU is now - * unlinking it. - */ - spin_lock_irqsave (&urb->lock, flags); - spin_lock (&hcd_data_lock); - - if (!urb->dev || !urb->dev->bus) { - retval = -ENODEV; - goto done; - } - - dev = urb->dev->hcpriv; - sys = &urb->dev->dev; - hcd = urb->dev->bus->hcpriv; - if (!dev || !hcd) { - retval = -ENODEV; - goto done; - } - - if (!urb->hcpriv) { - retval = -EINVAL; - goto done; - } - - /* Any status except -EINPROGRESS means something already started to - * unlink this URB from the hardware. So there's no more work to do. - * - * FIXME use better explicit urb state - */ - if (urb->status != -EINPROGRESS) { - retval = -EBUSY; - goto done; - } - - /* maybe set up to block until the urb's completion fires. the - * lower level hcd code is always async, locking on urb->status - * updates; an intercepted completion unblocks us. - */ - if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) { - if (in_interrupt ()) { - dev_dbg (hcd->controller, "non-async unlink in_interrupt"); - retval = -EWOULDBLOCK; - goto done; - } - /* synchronous unlink: block till we see the completion */ - init_completion (&splice.done); - splice.complete = urb->complete; - splice.context = urb->context; - urb->complete = unlink_complete; - urb->context = &splice; - urb->status = -ENOENT; - } else { - /* asynchronous unlink */ - urb->status = -ECONNRESET; - } - spin_unlock (&hcd_data_lock); - spin_unlock_irqrestore (&urb->lock, flags); - - // FIXME remove splicing, so this becomes unlink1 (hcd, urb); - if (urb == (struct urb *) hcd->rh_timer.data) { - usb_rh_status_dequeue (hcd, urb); - retval = 0; - } else { - retval = hcd->driver->urb_dequeue (hcd, urb); - - /* hcds shouldn't really fail these calls, but... */ - if (retval) { - dev_dbg (sys, "dequeue %p --> %d\n", urb, retval); - if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) { - spin_lock_irqsave (&urb->lock, flags); - urb->complete = splice.complete; - urb->context = splice.context; - spin_unlock_irqrestore (&urb->lock, flags); - } - goto bye; - } - } - - /* block till giveback, if needed */ - if (urb->transfer_flags & URB_ASYNC_UNLINK) - return -EINPROGRESS; - - wait_for_completion (&splice.done); - return 0; - -done: - spin_unlock (&hcd_data_lock); - spin_unlock_irqrestore (&urb->lock, flags); -bye: - if (retval && sys && sys->driver) - dev_dbg (sys, "hcd_unlink_urb %p fail %d\n", urb, retval); - return retval; -} - -/*-------------------------------------------------------------------------*/ - -/* disables the endpoint: cancels any pending urbs, then synchronizes with - * the hcd to make sure all endpoint state is gone from hardware. use for - * set_configuration, set_interface, driver removal, physical disconnect. - * - * example: a qh stored in hcd_dev.ep[], holding state related to endpoint - * type, maxpacket size, toggle, halt status, and scheduling. - */ -static void hcd_endpoint_disable (struct usb_device *udev, int endpoint) -{ - unsigned long flags; - struct hcd_dev *dev; - struct usb_hcd *hcd; - struct urb *urb; - unsigned epnum = endpoint & USB_ENDPOINT_NUMBER_MASK; - - dev = udev->hcpriv; - hcd = udev->bus->hcpriv; - -rescan: - /* (re)block new requests, as best we can */ - if (endpoint & USB_DIR_IN) { - usb_endpoint_halt (udev, epnum, 0); - udev->epmaxpacketin [epnum] = 0; - } else { - usb_endpoint_halt (udev, epnum, 1); - udev->epmaxpacketout [epnum] = 0; - } - - /* then kill any current requests */ - spin_lock_irqsave (&hcd_data_lock, flags); - list_for_each_entry (urb, &dev->urb_list, urb_list) { - int tmp = urb->pipe; - - /* ignore urbs for other endpoints */ - if (usb_pipeendpoint (tmp) != epnum) - continue; - if ((tmp ^ endpoint) & USB_DIR_IN) - continue; - - /* another cpu may be in hcd, spinning on hcd_data_lock - * to giveback() this urb. the races here should be - * small, but a full fix needs a new "can't submit" - * urb state. - */ - if (urb->status != -EINPROGRESS) - continue; - usb_get_urb (urb); - spin_unlock_irqrestore (&hcd_data_lock, flags); - - spin_lock_irqsave (&urb->lock, flags); - tmp = urb->status; - if (tmp == -EINPROGRESS) - urb->status = -ESHUTDOWN; - spin_unlock_irqrestore (&urb->lock, flags); - - /* kick hcd unless it's already returning this */ - if (tmp == -EINPROGRESS) { - tmp = urb->pipe; - unlink1 (hcd, urb); - dev_dbg (hcd->controller, - "shutdown urb %p pipe %08x ep%d%s%s\n", - urb, tmp, usb_pipeendpoint (tmp), - (tmp & USB_DIR_IN) ? "in" : "out", - ({ char *s; \ - switch (usb_pipetype (tmp)) { \ - case PIPE_CONTROL: s = ""; break; \ - case PIPE_BULK: s = "-bulk"; break; \ - case PIPE_INTERRUPT: s = "-intr"; break; \ - default: s = "-iso"; break; \ - }; s;})); - } - usb_put_urb (urb); - - /* list contents may have changed */ - goto rescan; - } - spin_unlock_irqrestore (&hcd_data_lock, flags); - - /* synchronize with the hardware, so old configuration state - * clears out immediately (and will be freed). - */ - might_sleep (); - if (hcd->driver->endpoint_disable) - hcd->driver->endpoint_disable (hcd, dev, endpoint); -} - -/*-------------------------------------------------------------------------*/ - -/* called by khubd, rmmod, apmd, or other thread for hcd-private cleanup. - * we're guaranteed that the device is fully quiesced. also, that each - * endpoint has been hcd_endpoint_disabled. - */ - -static int hcd_free_dev (struct usb_device *udev) -{ - struct hcd_dev *dev; - struct usb_hcd *hcd; - unsigned long flags; - - if (!udev || !udev->hcpriv) - return -EINVAL; - - if (!udev->bus || !udev->bus->hcpriv) - return -ENODEV; - - // should udev->devnum == -1 ?? - - dev = udev->hcpriv; - hcd = udev->bus->hcpriv; - - /* device driver problem with refcounts? */ - if (!list_empty (&dev->urb_list)) { - dev_dbg (hcd->controller, "free busy dev, %s devnum %d (bug!)\n", - hcd->self.bus_name, udev->devnum); - return -EINVAL; - } - - spin_lock_irqsave (&hcd_data_lock, flags); - list_del (&dev->dev_list); - udev->hcpriv = NULL; - spin_unlock_irqrestore (&hcd_data_lock, flags); - - kfree (dev); - return 0; -} - -/* - * usb_hcd_operations - adapts usb_bus framework to HCD framework (bus glue) - * - * When registering a USB bus through the HCD framework code, use this - * usb_operations vector. The PCI glue layer does so automatically; only - * bus glue for non-PCI system busses will need to use this. - */ -struct usb_operations usb_hcd_operations = { - .allocate = hcd_alloc_dev, - .get_frame_number = hcd_get_frame_number, - .submit_urb = hcd_submit_urb, - .unlink_urb = hcd_unlink_urb, - .deallocate = hcd_free_dev, - .buffer_alloc = hcd_buffer_alloc, - .buffer_free = hcd_buffer_free, - .disable = hcd_endpoint_disable, -}; -EXPORT_SYMBOL (usb_hcd_operations); - -/*-------------------------------------------------------------------------*/ - -/** - * usb_hcd_giveback_urb - return URB from HCD to device driver - * @hcd: host controller returning the URB - * @urb: urb being returned to the USB device driver. - * @regs: pt_regs, passed down to the URB completion handler - * Context: in_interrupt() - * - * This hands the URB from HCD to its USB device driver, using its - * completion function. The HCD has freed all per-urb resources - * (and is done using urb->hcpriv). It also released all HCD locks; - * the device driver won't cause problems if it frees, modifies, - * or resubmits this URB. - */ -void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs) -{ - urb_unlink (urb); - - // NOTE: a generic device/urb monitoring hook would go here. - // hcd_monitor_hook(MONITOR_URB_FINISH, urb, dev) - // It would catch exit/unlink paths for all urbs. - - /* lower level hcd code should use *_dma exclusively */ - if (!(urb->transfer_flags & URB_NO_DMA_MAP)) { - if (usb_pipecontrol (urb->pipe)) - pci_unmap_single (hcd->pdev, urb->setup_dma, - sizeof (struct usb_ctrlrequest), - PCI_DMA_TODEVICE); - if (urb->transfer_buffer_length != 0) - pci_unmap_single (hcd->pdev, urb->transfer_dma, - urb->transfer_buffer_length, - usb_pipein (urb->pipe) - ? PCI_DMA_FROMDEVICE - : PCI_DMA_TODEVICE); - } - - /* pass ownership to the completion handler */ - urb->complete (urb, regs); - usb_put_urb (urb); -} -EXPORT_SYMBOL (usb_hcd_giveback_urb); - -/*-------------------------------------------------------------------------*/ - -/** - * usb_hcd_irq - hook IRQs to HCD framework (bus glue) - * @irq: the IRQ being raised - * @__hcd: pointer to the HCD whose IRQ is beinng signaled - * @r: saved hardware registers - * - * When registering a USB bus through the HCD framework code, use this - * to handle interrupts. The PCI glue layer does so automatically; only - * bus glue for non-PCI system busses will need to use this. - */ -irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs * r) -{ - struct usb_hcd *hcd = __hcd; - int start = hcd->state; - - if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */ - return IRQ_NONE; - - hcd->driver->irq (hcd, r); - if (hcd->state != start && hcd->state == USB_STATE_HALT) - usb_hc_died (hcd); - return IRQ_HANDLED; -} -EXPORT_SYMBOL (usb_hcd_irq); - -/*-------------------------------------------------------------------------*/ - -static void hcd_panic (void *_hcd) -{ - struct usb_hcd *hcd = _hcd; - hcd->driver->stop (hcd); -} - -/** - * usb_hc_died - report abnormal shutdown of a host controller (bus glue) - * @hcd: pointer to the HCD representing the controller - * - * This is called by bus glue to report a USB host controller that died - * while operations may still have been pending. It's called automatically - * by the PCI glue, so only glue for non-PCI busses should need to call it. - */ -void usb_hc_died (struct usb_hcd *hcd) -{ - struct list_head *devlist, *urblist; - struct hcd_dev *dev; - struct urb *urb; - unsigned long flags; - - /* flag every pending urb as done */ - spin_lock_irqsave (&hcd_data_lock, flags); - list_for_each (devlist, &hcd->dev_list) { - dev = list_entry (devlist, struct hcd_dev, dev_list); - list_for_each (urblist, &dev->urb_list) { - urb = list_entry (urblist, struct urb, urb_list); - dev_dbg (hcd->controller, "shutdown %s urb %p pipe %x, current status %d\n", - hcd->self.bus_name, urb, urb->pipe, urb->status); - if (urb->status == -EINPROGRESS) - urb->status = -ESHUTDOWN; - } - } - urb = (struct urb *) hcd->rh_timer.data; - if (urb) - urb->status = -ESHUTDOWN; - spin_unlock_irqrestore (&hcd_data_lock, flags); - - /* hcd->stop() needs a task context */ - INIT_WORK (&hcd->work, hcd_panic, hcd); - (void) schedule_work (&hcd->work); -} -EXPORT_SYMBOL (usb_hc_died); - diff --git a/lib/usb/core/hcd.h b/lib/usb/core/hcd.h deleted file mode 100644 index f0d9f800e..000000000 --- a/lib/usb/core/hcd.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (c) 2001-2002 by David Brownell - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#ifdef __KERNEL__ - -/* This file contains declarations of usbcore internals that are mostly - * used or exposed by Host Controller Drivers. - */ - -/* - * USB Packet IDs (PIDs) - */ -#define USB_PID_UNDEF_0 0xf0 -#define USB_PID_OUT 0xe1 -#define USB_PID_ACK 0xd2 -#define USB_PID_DATA0 0xc3 -#define USB_PID_PING 0xb4 /* USB 2.0 */ -#define USB_PID_SOF 0xa5 -#define USB_PID_NYET 0x96 /* USB 2.0 */ -#define USB_PID_DATA2 0x87 /* USB 2.0 */ -#define USB_PID_SPLIT 0x78 /* USB 2.0 */ -#define USB_PID_IN 0x69 -#define USB_PID_NAK 0x5a -#define USB_PID_DATA1 0x4b -#define USB_PID_PREAMBLE 0x3c /* Token mode */ -#define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */ -#define USB_PID_SETUP 0x2d -#define USB_PID_STALL 0x1e -#define USB_PID_MDATA 0x0f /* USB 2.0 */ - -/*-------------------------------------------------------------------------*/ - -/* - * USB Host Controller Driver (usb_hcd) framework - * - * Since "struct usb_bus" is so thin, you can't share much code in it. - * This framework is a layer over that, and should be more sharable. - */ - -/*-------------------------------------------------------------------------*/ - -struct usb_hcd { /* usb_bus.hcpriv points to this */ - - /* - * housekeeping - */ - struct usb_bus self; /* hcd is-a bus */ - - const char *product_desc; /* product/vendor string */ - const char *description; /* "ehci-hcd" etc */ - - struct timer_list rh_timer; /* drives root hub */ - struct list_head dev_list; /* devices on this bus */ - struct work_struct work; - - /* - * hardware info/state - */ - struct hc_driver *driver; /* hw-specific hooks */ - int irq; /* irq allocated */ - void *regs; /* device memory/io */ - struct device *controller; /* handle to hardware */ - - /* a few non-PCI controllers exist, mostly for OHCI */ - struct pci_dev *pdev; /* pci is typical */ -#ifdef CONFIG_PCI - int region; /* pci region for regs */ - u32 pci_state [16]; /* for PM state save */ - atomic_t resume_count; /* multiple resumes issue */ -#endif - -#define HCD_BUFFER_POOLS 4 - struct pci_pool *pool [HCD_BUFFER_POOLS]; - - int state; -# define __ACTIVE 0x01 -# define __SLEEPY 0x02 -# define __SUSPEND 0x04 -# define __TRANSIENT 0x80 - -# define USB_STATE_HALT 0 -# define USB_STATE_RUNNING (__ACTIVE) -# define USB_STATE_READY (__ACTIVE|__SLEEPY) -# define USB_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE) -# define USB_STATE_RESUMING (__SUSPEND|__TRANSIENT) -# define USB_STATE_SUSPENDED (__SUSPEND) - -#define HCD_IS_RUNNING(state) ((state) & __ACTIVE) -#define HCD_IS_SUSPENDED(state) ((state) & __SUSPEND) - - /* more shared queuing code would be good; it should support - * smarter scheduling, handle transaction translators, etc; - * input size of periodic table to an interrupt scheduler. - * (ohci 32, uhci 1024, ehci 256/512/1024). - */ -}; - -/* 2.4 does this a bit differently ... */ -static inline struct usb_bus *hcd_to_bus (struct usb_hcd *hcd) -{ - return &hcd->self; -} - - -struct hcd_dev { /* usb_device.hcpriv points to this */ - struct list_head dev_list; /* on this hcd */ - struct list_head urb_list; /* pending on this dev */ - - /* per-configuration HC/HCD state, such as QH or ED */ - void *ep[32]; -}; - -// urb.hcpriv is really hardware-specific - -struct hcd_timeout { /* timeouts we allocate */ - struct list_head timeout_list; - struct timer_list timer; -}; - -/*-------------------------------------------------------------------------*/ - -/* - * FIXME usb_operations should vanish or become hc_driver, - * when usb_bus and usb_hcd become the same thing. - */ - -struct usb_operations { - int (*allocate)(struct usb_device *); - int (*deallocate)(struct usb_device *); - int (*get_frame_number) (struct usb_device *usb_dev); - int (*submit_urb) (struct urb *urb, int mem_flags); - int (*unlink_urb) (struct urb *urb); - - /* allocate dma-consistent buffer for URB_DMA_NOMAPPING */ - void *(*buffer_alloc)(struct usb_bus *bus, size_t size, - int mem_flags, - dma_addr_t *dma); - void (*buffer_free)(struct usb_bus *bus, size_t size, - void *addr, dma_addr_t dma); - - void (*disable)(struct usb_device *udev, int bEndpointAddress); -}; - -/* each driver provides one of these, and hardware init support */ - -struct pt_regs; - -struct hc_driver { - const char *description; /* "ehci-hcd" etc */ - - /* irq handler */ - void (*irq) (struct usb_hcd *hcd, struct pt_regs *regs); - - int flags; -#define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ -#define HCD_USB11 0x0010 /* USB 1.1 */ -#define HCD_USB2 0x0020 /* USB 2.0 */ - - /* called to init HCD and root hub */ - int (*start) (struct usb_hcd *hcd); - - /* called after all devices were suspended */ - int (*suspend) (struct usb_hcd *hcd, u32 state); - - /* called before any devices get resumed */ - int (*resume) (struct usb_hcd *hcd); - - /* cleanly make HCD stop writing memory and doing I/O */ - void (*stop) (struct usb_hcd *hcd); - - /* return current frame number */ - int (*get_frame_number) (struct usb_hcd *hcd); - - /* memory lifecycle */ - struct usb_hcd *(*hcd_alloc) (void); - void (*hcd_free) (struct usb_hcd *hcd); - - /* manage i/o requests, device state */ - int (*urb_enqueue) (struct usb_hcd *hcd, struct urb *urb, - int mem_flags); - int (*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb); - - /* hw synch, freeing endpoint resources that urb_dequeue can't */ - void (*endpoint_disable)(struct usb_hcd *hcd, - struct hcd_dev *dev, int bEndpointAddress); - - /* root hub support */ - int (*hub_status_data) (struct usb_hcd *hcd, char *buf); - int (*hub_control) (struct usb_hcd *hcd, - u16 typeReq, u16 wValue, u16 wIndex, - char *buf, u16 wLength); -}; - -extern void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs); -extern void usb_bus_init (struct usb_bus *bus); -extern void usb_rh_status_dequeue (struct usb_hcd *hcd, struct urb *urb); - -#ifdef CONFIG_PCI -struct pci_dev; -struct pci_device_id; -extern int usb_hcd_pci_probe (struct pci_dev *dev, - const struct pci_device_id *id); -extern void usb_hcd_pci_remove (struct pci_dev *dev); - -#ifdef CONFIG_PM -// FIXME: see Documentation/power/pci.txt (2.4.6 and later?) -// extern int usb_hcd_pci_save_state (struct pci_dev *dev, u32 state); -extern int usb_hcd_pci_suspend (struct pci_dev *dev, u32 state); -extern int usb_hcd_pci_resume (struct pci_dev *dev); -// extern int usb_hcd_pci_enable_wake (struct pci_dev *dev, u32 state, int flg); -#endif /* CONFIG_PM */ - -#endif /* CONFIG_PCI */ - -/* pci-ish (pdev null is ok) buffer alloc/mapping support */ -int hcd_buffer_create (struct usb_hcd *hcd); -void hcd_buffer_destroy (struct usb_hcd *hcd); - -void *hcd_buffer_alloc (struct usb_bus *bus, size_t size, - int mem_flags, dma_addr_t *dma); -void hcd_buffer_free (struct usb_bus *bus, size_t size, - void *addr, dma_addr_t dma); - -/* generic bus glue, needed for host controllers that don't use PCI */ -extern struct usb_operations usb_hcd_operations; -extern irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs *r); -extern void usb_hc_died (struct usb_hcd *hcd); - -/* -------------------------------------------------------------------------- */ - -/* Enumeration is only for the hub driver, or HCD virtual root hubs */ -extern int usb_new_device(struct usb_device *dev, struct device *parent); -extern void usb_connect(struct usb_device *dev); -extern void usb_disconnect(struct usb_device **); - -/* exported to hub driver ONLY to support usb_reset_device () */ -extern int usb_get_configuration(struct usb_device *dev); -extern void usb_set_maxpacket(struct usb_device *dev); -extern void usb_destroy_configuration(struct usb_device *dev); -extern int usb_set_address(struct usb_device *dev); - -/* use these only before the device's address has been set */ -#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30)) -#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | USB_DIR_IN) - -/*-------------------------------------------------------------------------*/ - -/* - * HCD Root Hub support - */ - -#include "hub.h" - -/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */ -#define DeviceRequest \ - ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) -#define DeviceOutRequest \ - ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) - -#define InterfaceRequest \ - ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) - -#define EndpointRequest \ - ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) -#define EndpointOutRequest \ - ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) - -/* table 9.6 standard features */ -#define DEVICE_REMOTE_WAKEUP 1 -#define ENDPOINT_HALT 0 - -/* class requests from the USB 2.0 hub spec, table 11-15 */ -/* GetBusState and SetHubDescriptor are optional, omitted */ -#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE) -#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE) -#define GetHubDescriptor (0xa000 | USB_REQ_GET_DESCRIPTOR) -#define GetHubStatus (0xa000 | USB_REQ_GET_STATUS) -#define GetPortStatus (0xa300 | USB_REQ_GET_STATUS) -#define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE) -#define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE) - - -/*-------------------------------------------------------------------------*/ - -/* - * Generic bandwidth allocation constants/support - */ -#define FRAME_TIME_USECS 1000L -#define BitTime(bytecount) (7 * 8 * bytecount / 6) /* with integer truncation */ - /* Trying not to use worst-case bit-stuffing - of (7/6 * 8 * bytecount) = 9.33 * bytecount */ - /* bytecount = data payload byte count */ - -#define NS_TO_US(ns) ((ns + 500L) / 1000L) - /* convert & round nanoseconds to microseconds */ - -extern void usb_claim_bandwidth (struct usb_device *dev, struct urb *urb, - int bustime, int isoc); -extern void usb_release_bandwidth (struct usb_device *dev, struct urb *urb, - int isoc); - -/* - * Full/low speed bandwidth allocation constants/support. - */ -#define BW_HOST_DELAY 1000L /* nanoseconds */ -#define BW_HUB_LS_SETUP 333L /* nanoseconds */ - /* 4 full-speed bit times (est.) */ - -#define FRAME_TIME_BITS 12000L /* frame = 1 millisecond */ -#define FRAME_TIME_MAX_BITS_ALLOC (90L * FRAME_TIME_BITS / 100L) -#define FRAME_TIME_MAX_USECS_ALLOC (90L * FRAME_TIME_USECS / 100L) - -extern int usb_check_bandwidth (struct usb_device *dev, struct urb *urb); - -/* - * Ceiling microseconds (typical) for that many bytes at high speed - * ISO is a bit less, no ACK ... from USB 2.0 spec, 5.11.3 (and needed - * to preallocate bandwidth) - */ -#define USB2_HOST_DELAY 5 /* nsec, guess */ -#define HS_USECS(bytes) NS_TO_US ( ((55 * 8 * 2083)/1000) \ - + ((2083UL * (3167 + BitTime (bytes)))/1000) \ - + USB2_HOST_DELAY) -#define HS_USECS_ISO(bytes) NS_TO_US ( ((long)(38 * 8 * 2.083)) \ - + ((2083UL * (3167 + BitTime (bytes)))/1000) \ - + USB2_HOST_DELAY) - -extern long usb_calc_bus_time (int speed, int is_input, - int isoc, int bytecount); - -/*-------------------------------------------------------------------------*/ - -extern struct usb_bus *usb_alloc_bus (struct usb_operations *); -extern void usb_free_bus (struct usb_bus *); - -extern void usb_register_bus (struct usb_bus *); -extern void usb_deregister_bus (struct usb_bus *); - -extern int usb_register_root_hub (struct usb_device *usb_dev, - struct device *parent_dev); - -/* for portability to 2.4, hcds should call this */ -static inline int hcd_register_root (struct usb_hcd *hcd) -{ - return usb_register_root_hub ( - hcd_to_bus (hcd)->root_hub, hcd->controller); -} - -/*-------------------------------------------------------------------------*/ - -/* exported only within usbcore */ - -extern struct list_head usb_bus_list; -extern struct semaphore usb_bus_list_lock; - -extern void usb_bus_get (struct usb_bus *bus); -extern void usb_bus_put (struct usb_bus *bus); - -extern int usb_find_interface_driver (struct usb_device *dev, - struct usb_interface *interface); - -#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep))) - -#define usb_endpoint_out(ep_dir) (!((ep_dir) & USB_DIR_IN)) - -/* - * USB device fs stuff - */ - -#ifdef CONFIG_USB_DEVICEFS - -/* - * these are expected to be called from the USB core/hub thread - * with the kernel lock held - */ -extern void usbfs_add_bus(struct usb_bus *bus); -extern void usbfs_remove_bus(struct usb_bus *bus); -extern void usbfs_add_device(struct usb_device *dev); -extern void usbfs_remove_device(struct usb_device *dev); -extern void usbfs_update_special (void); - -extern int usbfs_init(void); -extern void usbfs_cleanup(void); - -#else /* CONFIG_USB_DEVICEFS */ - -static inline void usbfs_add_bus(struct usb_bus *bus) {} -static inline void usbfs_remove_bus(struct usb_bus *bus) {} -static inline void usbfs_add_device(struct usb_device *dev) {} -static inline void usbfs_remove_device(struct usb_device *dev) {} -static inline void usbfs_update_special (void) {} - -static inline int usbfs_init(void) { return 0; } -static inline void usbfs_cleanup(void) { } - -#endif /* CONFIG_USB_DEVICEFS */ - -/*-------------------------------------------------------------------------*/ - -/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */ -// bleech -- resurfaced in 2.4.11 or 2.4.12 -#define bitmap DeviceRemovable - - -/*-------------------------------------------------------------------------*/ - -/* random stuff */ - -#define RUN_CONTEXT (in_irq () ? "in_irq" \ - : (in_interrupt () ? "in_interrupt" : "can sleep")) - - -#endif /* __KERNEL__ */ - diff --git a/lib/usb/core/hub.c b/lib/usb/core/hub.c deleted file mode 100644 index bc3059ff0..000000000 --- a/lib/usb/core/hub.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* - * USB hub driver. - * - * (C) Copyright 1999 Linus Torvalds - * (C) Copyright 1999 Johannes Erdfelt - * (C) Copyright 1999 Gregory P. Smith - * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au) - * - */ -#define DEBUG -#if 0 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif -#include -#include -#include - -#include -#include -#include - -#include "hcd.h" -#include "hub.h" -#else -#include "../usb_wrapper.h" -#include "hcd.h" -#include "hub.h" -#define DEBUG -#endif - -/* Wakes up khubd */ -static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED; -static DECLARE_MUTEX(usb_address0_sem); - -static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */ -static LIST_HEAD(hub_list); /* List of all hubs (for cleanup) */ - -static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); -static pid_t khubd_pid = 0; /* PID of khubd */ -static DECLARE_COMPLETION(khubd_exited); - -#ifdef DEBUG -static inline char *portspeed (int portstatus) -{ - if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED)) - return "480 Mb/s"; - else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED)) - return "1.5 Mb/s"; - else - return "12 Mb/s"; -} -#endif - -/* for dev_info, dev_dbg, etc */ -static inline struct device *hubdev (struct usb_device *dev) -{ - return &dev->actconfig->interface [0].dev; -} - -/* USB 2.0 spec Section 11.24.4.5 */ -static int get_hub_descriptor(struct usb_device *dev, void *data, int size) -{ - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, - USB_DT_HUB << 8, 0, data, size, HZ * USB_CTRL_GET_TIMEOUT); -} - -/* - * USB 2.0 spec Section 11.24.2.1 - */ -static int clear_hub_feature(struct usb_device *dev, int feature) -{ - return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, HZ); -} - -/* - * USB 2.0 spec Section 11.24.2.2 - * BUG: doesn't handle port indicator selector in high byte of wIndex - */ -static int clear_port_feature(struct usb_device *dev, int port, int feature) -{ - return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ); -} - -/* - * USB 2.0 spec Section 11.24.2.13 - * BUG: doesn't handle port indicator selector in high byte of wIndex - */ -static int set_port_feature(struct usb_device *dev, int port, int feature) -{ - return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ); -} - -/* - * USB 2.0 spec Section 11.24.2.6 - */ -static int get_hub_status(struct usb_device *dev, - struct usb_hub_status *data) -{ - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, - data, sizeof(*data), HZ * USB_CTRL_GET_TIMEOUT); -} - -/* - * USB 2.0 spec Section 11.24.2.7 - */ -static int get_port_status(struct usb_device *dev, int port, - struct usb_port_status *data) -{ - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port, - data, sizeof(*data), HZ * USB_CTRL_GET_TIMEOUT); -} - -/* completion function, fires on port status changes and various faults */ -static void hub_irq(struct urb *urb, struct pt_regs *regs) -{ - struct usb_hub *hub = (struct usb_hub *)urb->context; - unsigned long flags; - int status; - - switch (urb->status) { - case -ENOENT: /* synchronous unlink */ - case -ECONNRESET: /* async unlink */ - case -ESHUTDOWN: /* hardware going away */ - return; - - default: /* presumably an error */ - /* Cause a hub reset after 10 consecutive errors */ - dev_dbg (&hub->intf->dev, "transfer --> %d\n", urb->status); - //debugPrint("transfer --> %d\n", urb->status); - if ((++hub->nerrors < 10) || hub->error) - goto resubmit; - hub->error = urb->status; - /* FALL THROUGH */ - - /* let khubd handle things */ - //case -EOVERFLOW: // Carcharius - having this here lets all 4 ports be setup n a v1.0 xbox - // however port 4 only works if you don't remove something and try to - // plug something back in - - case 0: /* we got data: port status changed */ - break; - } - - hub->nerrors = 0; - - /* Something happened, let khubd figure it out */ - spin_lock_irqsave(&hub_event_lock, flags); - if (list_empty(&hub->event_list)) { - list_add(&hub->event_list, &hub_event_list); - wake_up(&khubd_wait); - } - spin_unlock_irqrestore(&hub_event_lock, flags); - -resubmit: - if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0 - /* ENODEV means we raced disconnect() */ - && status != -ENODEV) - dev_err (&hub->intf->dev, "resubmit --> %d\n", urb->status); -} - -/* USB 2.0 spec Section 11.24.2.3 */ -static inline int -hub_clear_tt_buffer (struct usb_device *hub, u16 devinfo, u16 tt) -{ - return usb_control_msg (hub, usb_rcvctrlpipe (hub, 0), - HUB_CLEAR_TT_BUFFER, USB_DIR_IN | USB_RECIP_OTHER, - devinfo, tt, 0, 0, HZ); -} - -/* - * enumeration blocks khubd for a long time. we use keventd instead, since - * long blocking there is the exception, not the rule. accordingly, HCDs - * talking to TTs must queue control transfers (not just bulk and iso), so - * both can talk to the same hub concurrently. - */ -static void hub_tt_kevent (void *arg) -{ - struct usb_hub *hub = arg; - unsigned long flags; - - spin_lock_irqsave (&hub->tt.lock, flags); - while (!list_empty (&hub->tt.clear_list)) { - struct list_head *temp; - struct usb_tt_clear *clear; - struct usb_device *dev; - int status; - - temp = hub->tt.clear_list.next; - clear = list_entry (temp, struct usb_tt_clear, clear_list); - list_del (&clear->clear_list); - - /* drop lock so HCD can concurrently report other TT errors */ - spin_unlock_irqrestore (&hub->tt.lock, flags); - dev = interface_to_usbdev (hub->intf); - status = hub_clear_tt_buffer (dev, clear->devinfo, clear->tt); - spin_lock_irqsave (&hub->tt.lock, flags); - - if (status) - err ("usb-%s-%s clear tt %d (%04x) error %d", - dev->bus->bus_name, dev->devpath, - clear->tt, clear->devinfo, status); - kfree (clear); - } - spin_unlock_irqrestore (&hub->tt.lock, flags); -} - -/** - * usb_hub_tt_clear_buffer - clear control/bulk TT state in high speed hub - * @dev: the device whose split transaction failed - * @pipe: identifies the endpoint of the failed transaction - * - * High speed HCDs use this to tell the hub driver that some split control or - * bulk transaction failed in a way that requires clearing internal state of - * a transaction translator. This is normally detected (and reported) from - * interrupt context. - * - * It may not be possible for that hub to handle additional full (or low) - * speed transactions until that state is fully cleared out. - */ -void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe) -{ - struct usb_tt *tt = dev->tt; - unsigned long flags; - struct usb_tt_clear *clear; - - /* we've got to cope with an arbitrary number of pending TT clears, - * since each TT has "at least two" buffers that can need it (and - * there can be many TTs per hub). even if they're uncommon. - */ - if ((clear = kmalloc (sizeof *clear, SLAB_ATOMIC)) == 0) { - err ("can't save CLEAR_TT_BUFFER state for hub at usb-%s-%s", - dev->bus->bus_name, tt->hub->devpath); - /* FIXME recover somehow ... RESET_TT? */ - return; - } - - /* info that CLEAR_TT_BUFFER needs */ - clear->tt = tt->multi ? dev->ttport : 1; - clear->devinfo = usb_pipeendpoint (pipe); - clear->devinfo |= dev->devnum << 4; - clear->devinfo |= usb_pipecontrol (pipe) - ? (USB_ENDPOINT_XFER_CONTROL << 11) - : (USB_ENDPOINT_XFER_BULK << 11); - if (usb_pipein (pipe)) - clear->devinfo |= 1 << 15; - - /* tell keventd to clear state for this TT */ - spin_lock_irqsave (&tt->lock, flags); - list_add_tail (&clear->clear_list, &tt->clear_list); - schedule_work (&tt->kevent); - spin_unlock_irqrestore (&tt->lock, flags); -} - -static void hub_power_on(struct usb_hub *hub) -{ - struct usb_device *dev; - int i; - - /* Enable power to the ports */ - dev_dbg(hubdev(interface_to_usbdev(hub->intf)), - "enabling power on all ports\n"); - dev = interface_to_usbdev(hub->intf); - - for (i = 0; i < hub->descriptor->bNbrPorts; i++) - set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER); - - /* Wait for power to be enabled */ - wait_ms(hub->descriptor->bPwrOn2PwrGood * 2); -} - -static int hub_hub_status(struct usb_hub *hub, - u16 *status, u16 *change) -{ - struct usb_device *dev = interface_to_usbdev (hub->intf); - int ret; - - ret = get_hub_status(dev, &hub->status->hub); - if (ret < 0) - dev_err (hubdev (dev), - "%s failed (err = %d)\n", __FUNCTION__, ret); - else { - *status = le16_to_cpu(hub->status->hub.wHubStatus); - *change = le16_to_cpu(hub->status->hub.wHubChange); - ret = 0; - } - return ret; -} - -static int hub_configure(struct usb_hub *hub, - struct usb_endpoint_descriptor *endpoint) -{ - struct usb_device *dev = interface_to_usbdev (hub->intf); - struct device *hub_dev; - u16 hubstatus, hubchange; - unsigned int pipe; - int maxp, ret; - char *message; - - hub->buffer = usb_buffer_alloc(dev, sizeof(*hub->buffer), GFP_KERNEL, - &hub->buffer_dma); - if (!hub->buffer) { - message = "can't allocate hub irq buffer"; - ret = -ENOMEM; - goto fail; - } - - hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL); - if (!hub->status) { - message = "can't kmalloc hub status buffer"; - ret = -ENOMEM; - goto fail; - } - - hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL); - if (!hub->descriptor) { - message = "can't kmalloc hub descriptor"; - ret = -ENOMEM; - goto fail; - } - - /* Request the entire hub descriptor. - * hub->descriptor can handle USB_MAXCHILDREN ports, - * but the hub can/will return fewer bytes here. - */ - ret = get_hub_descriptor(dev, hub->descriptor, - sizeof(*hub->descriptor)); - if (ret < 0) { - message = "can't read hub descriptor"; - goto fail; - } else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) { - message = "hub has too many ports!"; - ret = -ENODEV; - goto fail; - } - - hub_dev = hubdev(dev); - dev->maxchild = hub->descriptor->bNbrPorts; - dev_info (hub_dev, "%d port%s detected\n", dev->maxchild, - (dev->maxchild == 1) ? "" : "s"); - - le16_to_cpus(&hub->descriptor->wHubCharacteristics); - - if (hub->descriptor->wHubCharacteristics & HUB_CHAR_COMPOUND) { - int i; - char portstr [USB_MAXCHILDREN + 1]; - - for (i = 0; i < dev->maxchild; i++) - portstr[i] = hub->descriptor->DeviceRemovable - [((i + 1) / 8)] & (1 << ((i + 1) % 8)) - ? 'F' : 'R'; - portstr[dev->maxchild] = 0; - dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr); - } else - dev_dbg(hub_dev, "standalone hub\n"); - - switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) { - case 0x00: - dev_dbg(hub_dev, "ganged power switching\n"); - break; - case 0x01: - dev_dbg(hub_dev, "individual port power switching\n"); - break; - case 0x02: - case 0x03: - dev_dbg(hub_dev, "unknown reserved power switching mode\n"); - break; - } - - switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) { - case 0x00: - dev_dbg(hub_dev, "global over-current protection\n"); - break; - case 0x08: - dev_dbg(hub_dev, "individual port over-current protection\n"); - break; - case 0x10: - case 0x18: - dev_dbg(hub_dev, "no over-current protection\n"); - break; - } - - spin_lock_init (&hub->tt.lock); - INIT_LIST_HEAD (&hub->tt.clear_list); - INIT_WORK (&hub->tt.kevent, hub_tt_kevent, hub); - switch (dev->descriptor.bDeviceProtocol) { - case 0: - break; - case 1: - dev_dbg(hub_dev, "Single TT\n"); - hub->tt.hub = dev; - break; - case 2: - dev_dbg(hub_dev, "TT per port\n"); - hub->tt.hub = dev; - hub->tt.multi = 1; - break; - default: - dev_dbg(hub_dev, "Unrecognized hub protocol %d\n", - dev->descriptor.bDeviceProtocol); - break; - } - - switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { - case 0x00: - if (dev->descriptor.bDeviceProtocol != 0) - dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n"); - break; - case 0x20: - dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n"); - break; - case 0x40: - dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n"); - break; - case 0x60: - dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n"); - break; - } - - dev_dbg(hub_dev, "Port indicators are %s supported\n", - (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) - ? "" : "not"); - - dev_dbg(hub_dev, "power on to power good time: %dms\n", - hub->descriptor->bPwrOn2PwrGood * 2); - dev_dbg(hub_dev, "hub controller current requirement: %dmA\n", - hub->descriptor->bHubContrCurrent); - - ret = hub_hub_status(hub, &hubstatus, &hubchange); - if (ret < 0) { - message = "can't get hub status"; - goto fail; - } - - dev_dbg(hub_dev, "local power source is %s\n", - (hubstatus & HUB_STATUS_LOCAL_POWER) - ? "lost (inactive)" : "good"); - - dev_dbg(hub_dev, "%sover-current condition exists\n", - (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); - - /* Start the interrupt endpoint */ - pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); - maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); - - if (maxp > sizeof(*hub->buffer)) - maxp = sizeof(*hub->buffer); - - hub->urb = usb_alloc_urb(0, GFP_KERNEL); - if (!hub->urb) { - message = "couldn't allocate interrupt urb"; - ret = -ENOMEM; - goto fail; - } - - usb_fill_int_urb(hub->urb, dev, pipe, *hub->buffer, maxp, hub_irq, - hub, endpoint->bInterval); - hub->urb->transfer_dma = hub->buffer_dma; - hub->urb->transfer_flags |= URB_NO_DMA_MAP; - ret = usb_submit_urb(hub->urb, GFP_KERNEL); - if (ret) { - message = "couldn't submit status urb"; - goto fail; - } - - /* Wake up khubd */ - wake_up(&khubd_wait); - - hub_power_on(hub); - - return 0; - -fail: - dev_err (&hub->intf->dev, "config failed, %s (err %d)\n", - message, ret); - /* hub_disconnect() frees urb and descriptor */ - return ret; -} - -static void hub_disconnect(struct usb_interface *intf) -{ - struct usb_hub *hub = usb_get_intfdata (intf); - unsigned long flags; - - if (!hub) - return; - - usb_set_intfdata (intf, NULL); - spin_lock_irqsave(&hub_event_lock, flags); - - /* Delete it and then reset it */ - list_del(&hub->event_list); - INIT_LIST_HEAD(&hub->event_list); - list_del(&hub->hub_list); - INIT_LIST_HEAD(&hub->hub_list); - - spin_unlock_irqrestore(&hub_event_lock, flags); - - down(&hub->khubd_sem); /* Wait for khubd to leave this hub alone. */ - up(&hub->khubd_sem); - - /* assuming we used keventd, it must quiesce too */ - if (hub->tt.hub) - flush_scheduled_work (); - - if (hub->urb) { - usb_unlink_urb(hub->urb); - usb_free_urb(hub->urb); - hub->urb = NULL; - } - - if (hub->descriptor) { - kfree(hub->descriptor); - hub->descriptor = NULL; - } - - if (hub->status) { - kfree(hub->status); - hub->status = NULL; - } - - if (hub->buffer) { - usb_buffer_free(interface_to_usbdev(intf), - sizeof(*hub->buffer), hub->buffer, - hub->buffer_dma); - hub->buffer = NULL; - } - - /* Free the memory */ - kfree(hub); -} - -static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct usb_host_interface *desc; - struct usb_endpoint_descriptor *endpoint; - struct usb_device *dev; - struct usb_hub *hub; - unsigned long flags; - - desc = intf->altsetting + intf->act_altsetting; - dev = interface_to_usbdev(intf); - - /* Some hubs have a subclass of 1, which AFAICT according to the */ - /* specs is not defined, but it works */ - if ((desc->desc.bInterfaceSubClass != 0) && - (desc->desc.bInterfaceSubClass != 1)) { -descriptor_error: - dev_err (&intf->dev, "bad descriptor, ignoring hub\n"); - return -EIO; - } - - /* Multiple endpoints? What kind of mutant ninja-hub is this? */ - if (desc->desc.bNumEndpoints != 1) { - goto descriptor_error; - } - - endpoint = &desc->endpoint[0].desc; - - /* Output endpoint? Curiouser and curiouser.. */ - if (!(endpoint->bEndpointAddress & USB_DIR_IN)) { - goto descriptor_error; - } - - /* If it's not an interrupt endpoint, we'd better punt! */ - if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) - != USB_ENDPOINT_XFER_INT) { - goto descriptor_error; - return -EIO; - } - - /* We found a hub */ - dev_info (hubdev (dev), "USB hub found\n"); - - hub = kmalloc(sizeof(*hub), GFP_KERNEL); - if (!hub) { - err("couldn't kmalloc hub struct"); - return -ENOMEM; - } - - memset(hub, 0, sizeof(*hub)); - - INIT_LIST_HEAD(&hub->event_list); - hub->intf = intf; - init_MUTEX(&hub->khubd_sem); - - /* Record the new hub's existence */ - spin_lock_irqsave(&hub_event_lock, flags); - INIT_LIST_HEAD(&hub->hub_list); - list_add(&hub->hub_list, &hub_list); - spin_unlock_irqrestore(&hub_event_lock, flags); - - usb_set_intfdata (intf, hub); - - if (hub_configure(hub, endpoint) >= 0) { - strcpy (intf->dev.name, "Hub"); - return 0; - } - - hub_disconnect (intf); - return -ENODEV; -} - -static int -hub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data) -{ - struct usb_device *hub = interface_to_usbdev (intf); - - /* assert ifno == 0 (part of hub spec) */ - switch (code) { - case USBDEVFS_HUB_PORTINFO: { - struct usbdevfs_hub_portinfo *info = user_data; - unsigned long flags; - int i; - - spin_lock_irqsave(&hub_event_lock, flags); - if (hub->devnum <= 0) - info->nports = 0; - else { - info->nports = hub->maxchild; - for (i = 0; i < info->nports; i++) { - if (hub->children[i] == NULL) - info->port[i] = 0; - else - info->port[i] = - hub->children[i]->devnum; - } - } - spin_unlock_irqrestore(&hub_event_lock, flags); - - return info->nports + 1; - } - - default: - return -ENOSYS; - } -} - -static int hub_reset(struct usb_hub *hub) -{ - struct usb_device *dev = interface_to_usbdev(hub->intf); - int i; - - /* Disconnect any attached devices */ - for (i = 0; i < hub->descriptor->bNbrPorts; i++) { - if (dev->children[i]) - usb_disconnect(&dev->children[i]); - } - - /* Attempt to reset the hub */ - if (hub->urb) - usb_unlink_urb(hub->urb); - else - return -1; - - if (usb_reset_device(dev)) - return -1; - - hub->urb->dev = dev; - if (usb_submit_urb(hub->urb, GFP_KERNEL)) - return -1; - - hub_power_on(hub); - - return 0; -} - -static void hub_start_disconnect(struct usb_device *dev) -{ - struct usb_device *parent = dev->parent; - int i; - - /* Find the device pointer to disconnect */ - if (parent) { - for (i = 0; i < parent->maxchild; i++) { - if (parent->children[i] == dev) { - usb_disconnect(&parent->children[i]); - return; - } - } - } - - err("cannot disconnect hub %s", dev->devpath); -} - -static int hub_port_status(struct usb_device *dev, int port, - u16 *status, u16 *change) -{ - struct usb_hub *hub = usb_get_intfdata (dev->actconfig->interface); - int ret; - - ret = get_port_status(dev, port + 1, &hub->status->port); - if (ret < 0) - dev_err (hubdev (dev), - "%s failed (err = %d)\n", __FUNCTION__, ret); - else { - *status = le16_to_cpu(hub->status->port.wPortStatus); - *change = le16_to_cpu(hub->status->port.wPortChange); - ret = 0; - } - return ret; -} - -#define HUB_RESET_TRIES 5 -#define HUB_PROBE_TRIES 2 -#define HUB_SHORT_RESET_TIME 10 -#define HUB_LONG_RESET_TIME 200 -#define HUB_RESET_TIMEOUT 500 - -/* return: -1 on error, 0 on success, 1 on disconnect. */ -static int hub_port_wait_reset(struct usb_device *hub, int port, - struct usb_device *dev, unsigned int delay) -{ - int delay_time, ret; - u16 portstatus; - u16 portchange; - - for (delay_time = 0; - delay_time < HUB_RESET_TIMEOUT; - delay_time += delay) { - /* wait to give the device a chance to reset */ - wait_ms(delay); - - /* read and decode port status */ - ret = hub_port_status(hub, port, &portstatus, &portchange); - if (ret < 0) { - return -1; - } - - /* Device went away? */ - if (!(portstatus & USB_PORT_STAT_CONNECTION)) - return 1; - - /* bomb out completely if something weird happened */ - if ((portchange & USB_PORT_STAT_C_CONNECTION)) - return -1; - - /* if we`ve finished resetting, then break out of the loop */ - if (!(portstatus & USB_PORT_STAT_RESET) && - (portstatus & USB_PORT_STAT_ENABLE)) { - if (portstatus & USB_PORT_STAT_HIGH_SPEED) - dev->speed = USB_SPEED_HIGH; - else if (portstatus & USB_PORT_STAT_LOW_SPEED) - dev->speed = USB_SPEED_LOW; - else - dev->speed = USB_SPEED_FULL; - return 0; - } - - /* switch to the long delay after two short delay failures */ - if (delay_time >= 2 * HUB_SHORT_RESET_TIME) - delay = HUB_LONG_RESET_TIME; - - dev_dbg (hubdev (hub), - "port %d not reset yet, waiting %dms\n", - port + 1, delay); - } - - return -1; -} - -/* return: -1 on error, 0 on success, 1 on disconnect. */ -static int hub_port_reset(struct usb_device *hub, int port, - struct usb_device *dev, unsigned int delay) -{ - int i, status; - - /* Reset the port */ - for (i = 0; i < HUB_RESET_TRIES; i++) { - set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET); - - /* return on disconnect or reset */ - status = hub_port_wait_reset(hub, port, dev, delay); - if (status != -1) { - clear_port_feature(hub, - port + 1, USB_PORT_FEAT_C_RESET); - dev->state = status - ? USB_STATE_NOTATTACHED - : USB_STATE_DEFAULT; - return status; - } - - dev_dbg (hubdev (hub), - "port %d not enabled, trying reset again...\n", - port + 1); - delay = HUB_LONG_RESET_TIME; - } - - dev_err (hubdev (hub), - "Cannot enable port %i. Maybe the USB cable is bad?\n", - port + 1); - - return -1; -} - -int hub_port_disable(struct usb_device *hub, int port) -{ - int ret; - - ret = clear_port_feature(hub, port + 1, USB_PORT_FEAT_ENABLE); - if (ret) - dev_err(hubdev(hub), "cannot disable port %d (err = %d)\n", - port + 1, ret); - - return ret; -} - -/* USB 2.0 spec, 7.1.7.3 / fig 7-29: - * - * Between connect detection and reset signaling there must be a delay - * of 100ms at least for debounce and power-settling. The corresponding - * timer shall restart whenever the downstream port detects a disconnect. - * - * Apparently there are some bluetooth and irda-dongles and a number - * of low-speed devices which require longer delays of about 200-400ms. - * Not covered by the spec - but easy to deal with. - * - * This implementation uses 400ms minimum debounce timeout and checks - * every 25ms for transient disconnects to restart the delay. - */ - -#define HUB_DEBOUNCE_TIMEOUT 400 -#define HUB_DEBOUNCE_STEP 25 -#define HUB_DEBOUNCE_STABLE 4 - -/* return: -1 on error, 0 on success, 1 on disconnect. */ -static int hub_port_debounce(struct usb_device *hub, int port) -{ - int ret; - int delay_time, stable_count; - u16 portchange, portstatus; - unsigned connection; - - connection = 0; - stable_count = 0; - for (delay_time = 0; delay_time < HUB_DEBOUNCE_TIMEOUT; delay_time += HUB_DEBOUNCE_STEP) { - wait_ms(HUB_DEBOUNCE_STEP); - - ret = hub_port_status(hub, port, &portstatus, &portchange); - if (ret < 0) - return -1; - - if ((portstatus & USB_PORT_STAT_CONNECTION) == connection) { - if (connection) { - if (++stable_count == HUB_DEBOUNCE_STABLE) - break; - } - } else { - stable_count = 0; - } - connection = portstatus & USB_PORT_STAT_CONNECTION; - - if ((portchange & USB_PORT_STAT_C_CONNECTION)) { - clear_port_feature(hub, port+1, USB_PORT_FEAT_C_CONNECTION); - } - } - - /* XXX Replace this with dbg() when 2.6 is about to ship. */ - dev_dbg (hubdev (hub), - "debounce: port %d: delay %dms stable %d status 0x%x\n", - port + 1, delay_time, stable_count, portstatus); - - return ((portstatus&USB_PORT_STAT_CONNECTION)) ? 0 : 1; -} - -static void hub_port_connect_change(struct usb_hub *hubstate, int port, - u16 portstatus, u16 portchange) -{ - struct usb_device *hub = interface_to_usbdev(hubstate->intf); - struct usb_device *dev; - unsigned int delay = HUB_SHORT_RESET_TIME; - int i; - - dev_dbg (&hubstate->intf->dev, - "port %d, status %x, change %x, %s\n", - port + 1, portstatus, portchange, portspeed (portstatus)); - - /* Clear the connection change status */ - clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_CONNECTION); - - /* Disconnect any existing devices under this port */ - if (hub->children[port]) - usb_disconnect(&hub->children[port]); - - /* Return now if nothing is connected */ - if (!(portstatus & USB_PORT_STAT_CONNECTION)) { - if (portstatus & USB_PORT_STAT_ENABLE) - hub_port_disable(hub, port); - - return; - } - - if (hub_port_debounce(hub, port)) { - dev_err (&hubstate->intf->dev, - "connect-debounce failed, port %d disabled\n", - port+1); - hub_port_disable(hub, port); - return; - } - - /* Some low speed devices have problems with the quick delay, so */ - /* be a bit pessimistic with those devices. RHbug #23670 */ - if (portstatus & USB_PORT_STAT_LOW_SPEED) - delay = HUB_LONG_RESET_TIME; - - down(&usb_address0_sem); - - for (i = 0; i < HUB_PROBE_TRIES; i++) { - struct usb_device *pdev; - int len; - - /* Allocate a new device struct */ - dev = usb_alloc_dev(hub, hub->bus); - if (!dev) { - dev_err (&hubstate->intf->dev, - "couldn't allocate usb_device\n"); - break; - } - - hub->children[port] = dev; - dev->state = USB_STATE_POWERED; - - /* Reset the device, and detect its speed */ - if (hub_port_reset(hub, port, dev, delay)) { - usb_put_dev(dev); - break; - } - - /* Find a new address for it */ - usb_connect(dev); - - /* Set up TT records, if needed */ - if (hub->tt) { - dev->tt = hub->tt; - dev->ttport = hub->ttport; - } else if (dev->speed != USB_SPEED_HIGH - && hub->speed == USB_SPEED_HIGH) { - dev->tt = &hubstate->tt; - dev->ttport = port + 1; - } - - /* Save readable and stable topology id, distinguishing - * devices by location for diagnostics, tools, etc. The - * string is a path along hub ports, from the root. Each - * device's id will be stable until USB is re-cabled, and - * hubs are often labeled with these port numbers. - * - * Initial size: ".NN" times five hubs + NUL = 16 bytes max - * (quite rare, since most hubs have 4-6 ports). - */ - pdev = dev->parent; - if (pdev->devpath [0] != '0') /* parent not root? */ - len = snprintf (dev->devpath, sizeof dev->devpath, - "%s.%d", pdev->devpath, port + 1); - /* root == "0", root port 2 == "2", port 3 that hub "2.3" */ - else - len = snprintf (dev->devpath, sizeof dev->devpath, - "%d", port + 1); - if (len == sizeof dev->devpath) - dev_err (&hubstate->intf->dev, - "devpath size! usb/%03d/%03d path %s\n", - dev->bus->busnum, dev->devnum, dev->devpath); - dev_info (&hubstate->intf->dev, - "new USB device on port %d, assigned address %d\n", - port + 1, dev->devnum); - - /* put the device in the global device tree. the hub port - * is the "bus_id"; hubs show in hierarchy like bridges - */ - dev->dev.parent = dev->parent->dev.parent->parent; - - /* Run it through the hoops (find a driver, etc) */ - if (!usb_new_device(dev, &hub->dev)) - goto done; - - /* Free the configuration if there was an error */ - usb_put_dev(dev); - - /* Switch to a long reset time */ - delay = HUB_LONG_RESET_TIME; - } - - hub->children[port] = NULL; - hub_port_disable(hub, port); -done: - up(&usb_address0_sem); -} - -static void hub_events(void) -{ - unsigned long flags; - struct list_head *tmp; - struct usb_device *dev; - struct usb_hub *hub; - u16 hubstatus; - u16 hubchange; - u16 portstatus; - u16 portchange; - int i, ret; - int m=0; - /* - * We restart the list every time to avoid a deadlock with - * deleting hubs downstream from this one. This should be - * safe since we delete the hub from the event list. - * Not the most efficient, but avoids deadlocks. - */ - - while (m<5) { - m++; - spin_lock_irqsave(&hub_event_lock, flags); - - if (list_empty(&hub_event_list)) - break; - - /* Grab the next entry from the beginning of the list */ - tmp = hub_event_list.next; - - hub = list_entry(tmp, struct usb_hub, event_list); - dev = interface_to_usbdev(hub->intf); - - list_del_init(tmp); - - if (unlikely(down_trylock(&hub->khubd_sem))) - BUG(); /* never blocks, we were on list */ - - spin_unlock_irqrestore(&hub_event_lock, flags); - - if (hub->error) { - dev_dbg (&hub->intf->dev, "resetting for error %d\n", - hub->error); - - if (hub_reset(hub)) { - dev_dbg (&hub->intf->dev, - "can't reset; disconnecting\n"); - up(&hub->khubd_sem); - hub_start_disconnect(dev); - continue; - } - - hub->nerrors = 0; - hub->error = 0; - } - - for (i = 0; i < hub->descriptor->bNbrPorts; i++) { - ret = hub_port_status(dev, i, &portstatus, &portchange); - if (ret < 0) { - continue; - } - - if (portchange & USB_PORT_STAT_C_CONNECTION) { - hub_port_connect_change(hub, i, portstatus, portchange); - } else if (portchange & USB_PORT_STAT_C_ENABLE) { - dev_dbg (hubdev (dev), - "port %d enable change, status %x\n", - i + 1, portstatus); - clear_port_feature(dev, - i + 1, USB_PORT_FEAT_C_ENABLE); - - /* - * EM interference sometimes causes badly - * shielded USB devices to be shutdown by - * the hub, this hack enables them again. - * Works at least with mouse driver. - */ - if (!(portstatus & USB_PORT_STAT_ENABLE) - && (portstatus & USB_PORT_STAT_CONNECTION) - && (dev->children[i])) { - dev_err (&hub->intf->dev, - "port %i " - "disabled by hub (EMI?), " - "re-enabling...", - i + 1); - hub_port_connect_change(hub, - i, portstatus, portchange); - } - } - - if (portchange & USB_PORT_STAT_C_SUSPEND) { - dev_dbg (&hub->intf->dev, - "suspend change on port %d\n", - i + 1); - clear_port_feature(dev, - i + 1, USB_PORT_FEAT_C_SUSPEND); - } - - if (portchange & USB_PORT_STAT_C_OVERCURRENT) { - dev_err (&hub->intf->dev, - "over-current change on port %d\n", - i + 1); - clear_port_feature(dev, - i + 1, USB_PORT_FEAT_C_OVER_CURRENT); - hub_power_on(hub); - } - - if (portchange & USB_PORT_STAT_C_RESET) { - dev_dbg (&hub->intf->dev, - "reset change on port %d\n", - i + 1); - clear_port_feature(dev, - i + 1, USB_PORT_FEAT_C_RESET); - } - } /* end for i */ - - /* deal with hub status changes */ - if (hub_hub_status(hub, &hubstatus, &hubchange) < 0) - dev_err (&hub->intf->dev, "get_hub_status failed\n"); - else { - if (hubchange & HUB_CHANGE_LOCAL_POWER) { - dev_dbg (&hub->intf->dev, "power change\n"); - clear_hub_feature(dev, C_HUB_LOCAL_POWER); - } - if (hubchange & HUB_CHANGE_OVERCURRENT) { - dev_dbg (&hub->intf->dev, "overcurrent change\n"); - wait_ms(500); /* Cool down */ - clear_hub_feature(dev, C_HUB_OVER_CURRENT); - hub_power_on(hub); - } - } - up(&hub->khubd_sem); - } /* end while (1) */ - - spin_unlock_irqrestore(&hub_event_lock, flags); -} - -static int hub_thread(void *__hub) -{ - /* - * This thread doesn't need any user-level access, - * so get rid of all our resources - */ - - daemonize("khubd"); - allow_signal(SIGKILL); - /* Send me a signal to get me die (for debugging) */ - do { - - hub_events(); - wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); - - if (current->flags & PF_FREEZE) - refrigerator(PF_IOTHREAD); - - } while (!signal_pending(current)); - -// dbg("hub_thread exiting"); - complete_and_exit(&khubd_exited, 0); -} - -static struct usb_device_id hub_id_table [] = { - { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, - .bDeviceClass = USB_CLASS_HUB}, - { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, - .bInterfaceClass = USB_CLASS_HUB}, - { } /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE (usb, hub_id_table); - -static struct usb_driver hub_driver = { - .owner = THIS_MODULE, - .name = "hub", - .probe = hub_probe, - .disconnect = hub_disconnect, - .ioctl = hub_ioctl, - .id_table = hub_id_table, -}; - -/* - * This should be a separate module. - */ -int usb_hub_init(void) -{ - pid_t pid; - - if (usb_register(&hub_driver) < 0) { - err("Unable to register USB hub driver"); - return -1; - } - - pid = kernel_thread(hub_thread, NULL, - CLONE_FS | CLONE_FILES | CLONE_SIGHAND); - if (pid >= 0) { - khubd_pid = pid; - return 0; - } - - /* Fall through if kernel_thread failed */ - usb_deregister(&hub_driver); - err("failed to start hub_thread"); - - return -1; -} - -void usb_hub_cleanup(void) -{ - int ret; - - /* Kill the thread */ - ret = kill_proc(khubd_pid, SIGKILL, 1); - - wait_for_completion(&khubd_exited); - - /* - * Hub resources are freed for us by usb_deregister. It calls - * usb_driver_purge on every device which in turn calls that - * devices disconnect function if it is using this driver. - * The hub_disconnect function takes care of releasing the - * individual hub resources. -greg - */ - usb_deregister(&hub_driver); -} /* usb_hub_cleanup() */ - -/* - * WARNING - If a driver calls usb_reset_device, you should simulate a - * disconnect() and probe() for other interfaces you doesn't claim. This - * is left up to the driver writer right now. This insures other drivers - * have a chance to re-setup their interface. - * - * Take a look at proc_resetdevice in devio.c for some sample code to - * do this. - * Use this only from within your probe function, otherwise use - * usb_reset_device() below, which ensure proper locking - */ -int usb_physical_reset_device(struct usb_device *dev) -{ - struct usb_device *parent = dev->parent; - struct usb_device_descriptor *descriptor; - int i, ret, port = -1; - - if (!parent) { - err("attempting to reset root hub!"); - return -EINVAL; - } - - for (i = 0; i < parent->maxchild; i++) - if (parent->children[i] == dev) { - port = i; - break; - } - - if (port < 0) - return -ENOENT; - - descriptor = kmalloc(sizeof *descriptor, GFP_NOIO); - if (!descriptor) { - return -ENOMEM; - } - - down(&usb_address0_sem); - - /* Send a reset to the device */ - if (hub_port_reset(parent, port, dev, HUB_SHORT_RESET_TIME)) { - hub_port_disable(parent, port); - up(&usb_address0_sem); - kfree(descriptor); - return(-ENODEV); - } - - /* Reprogram the Address */ - ret = usb_set_address(dev); - if (ret < 0) { - err("USB device not accepting new address (error=%d)", ret); - hub_port_disable(parent, port); - up(&usb_address0_sem); - kfree(descriptor); - return ret; - } - - /* Let the SET_ADDRESS settle */ - wait_ms(10); - - up(&usb_address0_sem); - - /* - * Now we fetch the configuration descriptors for the device and - * see if anything has changed. If it has, we dump the current - * parsed descriptors and reparse from scratch. Then we leave - * the device alone for the caller to finish setting up. - * - * If nothing changed, we reprogram the configuration and then - * the alternate settings. - */ - - ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, descriptor, - sizeof(*descriptor)); - if (ret < 0) { - kfree(descriptor); - return ret; - } - - le16_to_cpus(&descriptor->bcdUSB); - le16_to_cpus(&descriptor->idVendor); - le16_to_cpus(&descriptor->idProduct); - le16_to_cpus(&descriptor->bcdDevice); - - if (memcmp(&dev->descriptor, descriptor, sizeof(*descriptor))) { - kfree(descriptor); - usb_destroy_configuration(dev); - - ret = usb_get_device_descriptor(dev); - if (ret < sizeof(dev->descriptor)) { - if (ret < 0) - err("unable to get device %s descriptor " - "(error=%d)", dev->devpath, ret); - else - err("USB device %s descriptor short read " - "(expected %Zi, got %i)", - dev->devpath, - sizeof(dev->descriptor), ret); - - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return -EIO; - } - - ret = usb_get_configuration(dev); - if (ret < 0) { - err("unable to get configuration (error=%d)", ret); - usb_destroy_configuration(dev); - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - - dev->actconfig = dev->config; - usb_set_maxpacket(dev); - - return 1; - } - - kfree(descriptor); - - ret = usb_set_configuration(dev, dev->actconfig->desc.bConfigurationValue); - if (ret < 0) { - err("failed to set dev %s active configuration (error=%d)", - dev->devpath, ret); - return ret; - } - - for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { - struct usb_interface *intf = &dev->actconfig->interface[i]; - struct usb_interface_descriptor *as; - - as = &intf->altsetting[intf->act_altsetting].desc; - ret = usb_set_interface(dev, as->bInterfaceNumber, - as->bAlternateSetting); - if (ret < 0) { - err("failed to set active alternate setting " - "for dev %s interface %d (error=%d)", - dev->devpath, i, ret); - return ret; - } - } - - return 0; -} - -int usb_reset_device(struct usb_device *udev) -{ - //struct device *gdev = &udev->dev; - int r; - - down_read(&gdev->bus->subsys.rwsem); - r = usb_physical_reset_device(udev); - up_read(&gdev->bus->subsys.rwsem); - - return r; -} - - diff --git a/lib/usb/core/hub.h b/lib/usb/core/hub.h deleted file mode 100644 index 1e2507820..000000000 --- a/lib/usb/core/hub.h +++ /dev/null @@ -1,195 +0,0 @@ -#ifndef __LINUX_HUB_H -#define __LINUX_HUB_H - -/* - * Hub protocol and driver data structures. - * - * Some of these are known to the "virtual root hub" code - * in host controller drivers. - */ -#if 0 -#include -#include -#include /* likely()/unlikely() */ -#endif -/* - * Hub request types - */ - -#define USB_RT_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE) -#define USB_RT_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER) - -/* - * Hub class requests - * See USB 2.0 spec Table 11-16 - */ -#define HUB_CLEAR_TT_BUFFER 8 -#define HUB_RESET_TT 9 -#define HUB_GET_TT_STATE 10 -#define HUB_STOP_TT 11 - -/* - * Hub Class feature numbers - * See USB 2.0 spec Table 11-17 - */ -#define C_HUB_LOCAL_POWER 0 -#define C_HUB_OVER_CURRENT 1 - -/* - * Port feature numbers - * See USB 2.0 spec Table 11-17 - */ -#define USB_PORT_FEAT_CONNECTION 0 -#define USB_PORT_FEAT_ENABLE 1 -#define USB_PORT_FEAT_SUSPEND 2 -#define USB_PORT_FEAT_OVER_CURRENT 3 -#define USB_PORT_FEAT_RESET 4 -#define USB_PORT_FEAT_POWER 8 -#define USB_PORT_FEAT_LOWSPEED 9 -#define USB_PORT_FEAT_HIGHSPEED 10 -#define USB_PORT_FEAT_C_CONNECTION 16 -#define USB_PORT_FEAT_C_ENABLE 17 -#define USB_PORT_FEAT_C_SUSPEND 18 -#define USB_PORT_FEAT_C_OVER_CURRENT 19 -#define USB_PORT_FEAT_C_RESET 20 -#define USB_PORT_FEAT_TEST 21 -#define USB_PORT_FEAT_INDICATOR 22 - -/* - * Hub Status and Hub Change results - * See USB 2.0 spec Table 11-19 and Table 11-20 - */ -struct usb_port_status { - __u16 wPortStatus; - __u16 wPortChange; -} __attribute__ ((packed)); - -/* - * wPortStatus bit field - * See USB 2.0 spec Table 11-21 - */ -#define USB_PORT_STAT_CONNECTION 0x0001 -#define USB_PORT_STAT_ENABLE 0x0002 -#define USB_PORT_STAT_SUSPEND 0x0004 -#define USB_PORT_STAT_OVERCURRENT 0x0008 -#define USB_PORT_STAT_RESET 0x0010 -/* bits 5 to 7 are reserved */ -#define USB_PORT_STAT_POWER 0x0100 -#define USB_PORT_STAT_LOW_SPEED 0x0200 -#define USB_PORT_STAT_HIGH_SPEED 0x0400 -#define USB_PORT_STAT_TEST 0x0800 -#define USB_PORT_STAT_INDICATOR 0x1000 -/* bits 13 to 15 are reserved */ - -/* - * wPortChange bit field - * See USB 2.0 spec Table 11-22 - * Bits 0 to 4 shown, bits 5 to 15 are reserved - */ -#define USB_PORT_STAT_C_CONNECTION 0x0001 -#define USB_PORT_STAT_C_ENABLE 0x0002 -#define USB_PORT_STAT_C_SUSPEND 0x0004 -#define USB_PORT_STAT_C_OVERCURRENT 0x0008 -#define USB_PORT_STAT_C_RESET 0x0010 - -/* - * wHubCharacteristics (masks) - * See USB 2.0 spec Table 11-13, offset 3 - */ -#define HUB_CHAR_LPSM 0x0003 /* D1 .. D0 */ -#define HUB_CHAR_COMPOUND 0x0004 /* D2 */ -#define HUB_CHAR_OCPM 0x0018 /* D4 .. D3 */ -#define HUB_CHAR_TTTT 0x0060 /* D6 .. D5 */ -#define HUB_CHAR_PORTIND 0x0080 /* D7 */ - -struct usb_hub_status { - __u16 wHubStatus; - __u16 wHubChange; -} __attribute__ ((packed)); - -/* - * Hub Status & Hub Change bit masks - * See USB 2.0 spec Table 11-19 and Table 11-20 - * Bits 0 and 1 for wHubStatus and wHubChange - * Bits 2 to 15 are reserved for both - */ -#define HUB_STATUS_LOCAL_POWER 0x0001 -#define HUB_STATUS_OVERCURRENT 0x0002 -#define HUB_CHANGE_LOCAL_POWER 0x0001 -#define HUB_CHANGE_OVERCURRENT 0x0002 - - -/* - * Hub descriptor - * See USB 2.0 spec Table 11-13 - */ - -#define USB_DT_HUB (USB_TYPE_CLASS | 0x09) -#define USB_DT_HUB_NONVAR_SIZE 7 - -struct usb_hub_descriptor { - __u8 bDescLength; - __u8 bDescriptorType; - __u8 bNbrPorts; - __u16 wHubCharacteristics; - __u8 bPwrOn2PwrGood; - __u8 bHubContrCurrent; - /* add 1 bit for hub status change; round to bytes */ - __u8 DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8]; - __u8 PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8]; -} __attribute__ ((packed)); - -struct usb_device; - -/* - * As of USB 2.0, full/low speed devices are segregated into trees. - * One type grows from USB 1.1 host controllers (OHCI, UHCI etc). - * The other type grows from high speed hubs when they connect to - * full/low speed devices using "Transaction Translators" (TTs). - * - * TTs should only be known to the hub driver, and high speed bus - * drivers (only EHCI for now). They affect periodic scheduling and - * sometimes control/bulk error recovery. - */ -struct usb_tt { - struct usb_device *hub; /* upstream highspeed hub */ - int multi; /* true means one TT per port */ - - /* for control/bulk error recovery (CLEAR_TT_BUFFER) */ - spinlock_t lock; - struct list_head clear_list; /* of usb_tt_clear */ - struct work_struct kevent; -}; - -struct usb_tt_clear { - struct list_head clear_list; - unsigned tt; - u16 devinfo; -}; - -extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe); - -struct usb_hub { - struct usb_interface *intf; /* the "real" device */ - struct urb *urb; /* for interrupt polling pipe */ - - /* buffer for urb ... 1 bit each for hub and children, rounded up */ - char (*buffer)[(USB_MAXCHILDREN + 1 + 7) / 8]; - dma_addr_t buffer_dma; /* DMA address for buffer */ - union { - struct usb_hub_status hub; - struct usb_port_status port; - } *status; /* buffer for status reports */ - - int error; /* last reported error */ - int nerrors; /* track consecutive errors */ - - struct list_head hub_list; /* all hubs */ - struct list_head event_list; /* hubs w/data or errs ready */ - - struct usb_hub_descriptor *descriptor; /* class descriptor */ - struct semaphore khubd_sem; - struct usb_tt tt; /* Transaction Translator */ -}; - -#endif /* __LINUX_HUB_H */ diff --git a/lib/usb/core/message.c b/lib/usb/core/message.c deleted file mode 100644 index c29a6aadd..000000000 --- a/lib/usb/core/message.c +++ /dev/null @@ -1,1053 +0,0 @@ -/* - * message.c - synchronous message handling - */ -#if 0 -#include /* for scatterlist macros */ -#include -#include -#include -#include -#include -#include -#else -#include "../usb_wrapper.h" -#endif - -#include "hcd.h" /* for usbcore internals */ - -struct usb_api_data { - wait_queue_head_t wqh; - int done; -}; - -static void usb_api_blocking_completion(struct urb *urb, struct pt_regs *regs) -{ - struct usb_api_data *awd = (struct usb_api_data *)urb->context; - - awd->done = 1; - wmb(); - wake_up(&awd->wqh); -} - -// Starts urb and waits for completion or timeout -static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length) -{ - DECLARE_WAITQUEUE(wait, current); - struct usb_api_data awd; - int status; - - init_waitqueue_head(&awd.wqh); - awd.done = 0; - - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&awd.wqh, &wait); - - urb->context = &awd; - status = usb_submit_urb(urb, GFP_ATOMIC); - if (status) { - // something went wrong - usb_free_urb(urb); - set_current_state(TASK_RUNNING); - remove_wait_queue(&awd.wqh, &wait); - return status; - } - - while (timeout && !awd.done) - { - timeout = schedule_timeout(timeout); - set_current_state(TASK_UNINTERRUPTIBLE); - rmb(); - } - - set_current_state(TASK_RUNNING); - remove_wait_queue(&awd.wqh, &wait); - - if (!timeout && !awd.done) { - if (urb->status != -EINPROGRESS) { /* No callback?!! */ - printk(KERN_ERR "usb: raced timeout, " - "pipe 0x%x status %d time left %d\n", - urb->pipe, urb->status, timeout); - status = urb->status; - } else { - warn("usb_control/bulk_msg: timeout"); - usb_unlink_urb(urb); // remove urb safely - status = -ETIMEDOUT; - } - } else - status = urb->status; - - if (actual_length) - *actual_length = urb->actual_length; - - usb_free_urb(urb); - return status; -} - -/*-------------------------------------------------------------------*/ -// returns status (negative) or length (positive) -int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, - struct usb_ctrlrequest *cmd, void *data, int len, int timeout) -{ - struct urb *urb; - int retv; - int length; - - urb = usb_alloc_urb(0, GFP_NOIO); - if (!urb) - return -ENOMEM; - - usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data, len, - usb_api_blocking_completion, 0); - - retv = usb_start_wait_urb(urb, timeout, &length); - - if (retv < 0) - return retv; - else - return length; -} - -/** - * usb_control_msg - Builds a control urb, sends it off and waits for completion - * @dev: pointer to the usb device to send the message to - * @pipe: endpoint "pipe" to send the message to - * @request: USB message request value - * @requesttype: USB message request type value - * @value: USB message value - * @index: USB message index value - * @data: pointer to the data to send - * @size: length in bytes of the data to send - * @timeout: time in jiffies to wait for the message to complete before - * timing out (if 0 the wait is forever) - * Context: !in_interrupt () - * - * This function sends a simple control message to a specified endpoint - * and waits for the message to complete, or timeout. - * - * If successful, it returns the number of bytes transferred, otherwise a negative error number. - * - * Don't use this function from within an interrupt context, like a - * bottom half handler. If you need an asynchronous message, or need to send - * a message from within interrupt context, use usb_submit_urb() - * If a thread in your driver uses this call, make sure your disconnect() - * method can wait for it to complete. Since you don't have a handle on - * the URB used, you can't cancel the request. - */ -int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, - __u16 value, __u16 index, void *data, __u16 size, int timeout) -{ - struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); - int ret; - - if (!dr) - return -ENOMEM; - - dr->bRequestType= requesttype; - dr->bRequest = request; - dr->wValue = cpu_to_le16p(&value); - dr->wIndex = cpu_to_le16p(&index); - dr->wLength = cpu_to_le16p(&size); - - //dbg("usb_control_msg"); - - ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); - - kfree(dr); - - return ret; -} - - -/** - * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion - * @usb_dev: pointer to the usb device to send the message to - * @pipe: endpoint "pipe" to send the message to - * @data: pointer to the data to send - * @len: length in bytes of the data to send - * @actual_length: pointer to a location to put the actual length transferred in bytes - * @timeout: time in jiffies to wait for the message to complete before - * timing out (if 0 the wait is forever) - * Context: !in_interrupt () - * - * This function sends a simple bulk message to a specified endpoint - * and waits for the message to complete, or timeout. - * - * If successful, it returns 0, otherwise a negative error number. - * The number of actual bytes transferred will be stored in the - * actual_length paramater. - * - * Don't use this function from within an interrupt context, like a - * bottom half handler. If you need an asynchronous message, or need to - * send a message from within interrupt context, use usb_submit_urb() - * If a thread in your driver uses this call, make sure your disconnect() - * method can wait for it to complete. Since you don't have a handle on - * the URB used, you can't cancel the request. - */ -int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, - void *data, int len, int *actual_length, int timeout) -{ - struct urb *urb; - - if (len < 0) - return -EINVAL; - - urb=usb_alloc_urb(0, GFP_KERNEL); - if (!urb) - return -ENOMEM; - - usb_fill_bulk_urb(urb, usb_dev, pipe, data, len, - usb_api_blocking_completion, 0); - - return usb_start_wait_urb(urb,timeout,actual_length); -} - -/*-------------------------------------------------------------------*/ -//#warning "Scatter-gather stuff disabled" -#if 0 -static void sg_clean (struct usb_sg_request *io) -{ - if (io->urbs) { - while (io->entries--) - usb_free_urb (io->urbs [io->entries]); - kfree (io->urbs); - io->urbs = 0; - } - if (io->dev->dev.dma_mask != 0) - usb_buffer_unmap_sg (io->dev, io->pipe, io->sg, io->nents); - io->dev = 0; -} - -static void sg_complete (struct urb *urb, struct pt_regs *regs) -{ - struct usb_sg_request *io = (struct usb_sg_request *) urb->context; - unsigned long flags; - - spin_lock_irqsave (&io->lock, flags); - - /* In 2.5 we require hcds' endpoint queues not to progress after fault - * reports, until the completion callback (this!) returns. That lets - * device driver code (like this routine) unlink queued urbs first, - * if it needs to, since the HC won't work on them at all. So it's - * not possible for page N+1 to overwrite page N, and so on. - * - * That's only for "hard" faults; "soft" faults (unlinks) sometimes - * complete before the HCD can get requests away from hardware, - * though never during cleanup after a hard fault. - */ - if (io->status - && (io->status != -ECONNRESET - || urb->status != -ECONNRESET) - && urb->actual_length) { - dev_err (io->dev->bus->controller, - "dev %s ep%d%s scatterlist error %d/%d\n", - io->dev->devpath, - usb_pipeendpoint (urb->pipe), - usb_pipein (urb->pipe) ? "in" : "out", - urb->status, io->status); - // BUG (); - } - - if (urb->status && urb->status != -ECONNRESET) { - int i, found, status; - - io->status = urb->status; - - /* the previous urbs, and this one, completed already. - * unlink the later ones so they won't rx/tx bad data, - * - * FIXME don't bother unlinking urbs that haven't yet been - * submitted; those non-error cases shouldn't be syslogged - */ - for (i = 0, found = 0; i < io->entries; i++) { - if (found) { - status = usb_unlink_urb (io->urbs [i]); - if (status && status != -EINPROGRESS) - err ("sg_complete, unlink --> %d", - status); - } else if (urb == io->urbs [i]) - found = 1; - } - } - - /* on the last completion, signal usb_sg_wait() */ - io->bytes += urb->actual_length; - io->count--; - if (!io->count) - complete (&io->complete); - - spin_unlock_irqrestore (&io->lock, flags); -} - - -/** - * usb_sg_init - initializes scatterlist-based bulk/interrupt I/O request - * @io: request block being initialized. until usb_sg_wait() returns, - * treat this as a pointer to an opaque block of memory, - * @dev: the usb device that will send or receive the data - * @pipe: endpoint "pipe" used to transfer the data - * @period: polling rate for interrupt endpoints, in frames or - * (for high speed endpoints) microframes; ignored for bulk - * @sg: scatterlist entries - * @nents: how many entries in the scatterlist - * @length: how many bytes to send from the scatterlist, or zero to - * send every byte identified in the list. - * @mem_flags: SLAB_* flags affecting memory allocations in this call - * - * Returns zero for success, else a negative errno value. This initializes a - * scatter/gather request, allocating resources such as I/O mappings and urb - * memory (except maybe memory used by USB controller drivers). - * - * The request must be issued using usb_sg_wait(), which waits for the I/O to - * complete (or to be canceled) and then cleans up all resources allocated by - * usb_sg_init(). - * - * The request may be canceled with usb_sg_cancel(), either before or after - * usb_sg_wait() is called. - */ -int usb_sg_init ( - struct usb_sg_request *io, - struct usb_device *dev, - unsigned pipe, - unsigned period, - struct scatterlist *sg, - int nents, - size_t length, - int mem_flags -) -{ - int i; - int urb_flags; - int dma; - - if (!io || !dev || !sg - || usb_pipecontrol (pipe) - || usb_pipeisoc (pipe) - || nents <= 0) - return -EINVAL; - - spin_lock_init (&io->lock); - io->dev = dev; - io->pipe = pipe; - io->sg = sg; - io->nents = nents; - - /* not all host controllers use DMA (like the mainstream pci ones); - * they can use PIO (sl811) or be software over another transport. - */ - dma = (dev->dev.dma_mask != 0); - if (dma) - io->entries = usb_buffer_map_sg (dev, pipe, sg, nents); - else - io->entries = nents; - - /* initialize all the urbs we'll use */ - if (io->entries <= 0) - return io->entries; - - io->count = 0; - io->urbs = kmalloc (io->entries * sizeof *io->urbs, mem_flags); - if (!io->urbs) - goto nomem; - - urb_flags = URB_ASYNC_UNLINK | URB_NO_DMA_MAP | URB_NO_INTERRUPT; - if (usb_pipein (pipe)) - urb_flags |= URB_SHORT_NOT_OK; - - for (i = 0; i < io->entries; i++, io->count = i) { - unsigned len; - - io->urbs [i] = usb_alloc_urb (0, mem_flags); - if (!io->urbs [i]) { - io->entries = i; - goto nomem; - } - - io->urbs [i]->dev = dev; - io->urbs [i]->pipe = pipe; - io->urbs [i]->interval = period; - io->urbs [i]->transfer_flags = urb_flags; - - io->urbs [i]->complete = sg_complete; - io->urbs [i]->context = io; - io->urbs [i]->status = -EINPROGRESS; - io->urbs [i]->actual_length = 0; - - if (dma) { - /* hc may use _only_ transfer_dma */ - io->urbs [i]->transfer_dma = sg_dma_address (sg + i); - len = sg_dma_len (sg + i); - } else { - /* hc may use _only_ transfer_buffer */ - io->urbs [i]->transfer_buffer = - page_address (sg [i].page) + sg [i].offset; - len = sg [i].length; - } - - if (length) { - len = min_t (unsigned, len, length); - length -= len; - if (length == 0) - io->entries = i + 1; - } - io->urbs [i]->transfer_buffer_length = len; - } - io->urbs [--i]->transfer_flags &= ~URB_NO_INTERRUPT; - - /* transaction state */ - io->status = 0; - io->bytes = 0; - init_completion (&io->complete); - return 0; - -nomem: - sg_clean (io); - return -ENOMEM; -} - - -/** - * usb_sg_wait - synchronously execute scatter/gather request - * @io: request block handle, as initialized with usb_sg_init(). - * some fields become accessible when this call returns. - * Context: !in_interrupt () - * - * This function blocks until the specified I/O operation completes. It - * leverages the grouping of the related I/O requests to get good transfer - * rates, by queueing the requests. At higher speeds, such queuing can - * significantly improve USB throughput. - * - * There are three kinds of completion for this function. - * (1) success, where io->status is zero. The number of io->bytes - * transferred is as requested. - * (2) error, where io->status is a negative errno value. The number - * of io->bytes transferred before the error is usually less - * than requested, and can be nonzero. - * (3) cancelation, a type of error with status -ECONNRESET that - * is initiated by usb_sg_cancel(). - * - * When this function returns, all memory allocated through usb_sg_init() or - * this call will have been freed. The request block parameter may still be - * passed to usb_sg_cancel(), or it may be freed. It could also be - * reinitialized and then reused. - * - * Data Transfer Rates: - * - * Bulk transfers are valid for full or high speed endpoints. - * The best full speed data rate is 19 packets of 64 bytes each - * per frame, or 1216 bytes per millisecond. - * The best high speed data rate is 13 packets of 512 bytes each - * per microframe, or 52 KBytes per millisecond. - * - * The reason to use interrupt transfers through this API would most likely - * be to reserve high speed bandwidth, where up to 24 KBytes per millisecond - * could be transferred. That capability is less useful for low or full - * speed interrupt endpoints, which allow at most one packet per millisecond, - * of at most 8 or 64 bytes (respectively). - */ -void usb_sg_wait (struct usb_sg_request *io) -{ - int i; - unsigned long flags; - - /* queue the urbs. */ - spin_lock_irqsave (&io->lock, flags); - for (i = 0; i < io->entries && !io->status; i++) { - int retval; - - retval = usb_submit_urb (io->urbs [i], SLAB_ATOMIC); - - /* after we submit, let completions or cancelations fire; - * we handshake using io->status. - */ - spin_unlock_irqrestore (&io->lock, flags); - switch (retval) { - /* maybe we retrying will recover */ - case -ENXIO: // hc didn't queue this one - case -EAGAIN: - case -ENOMEM: - retval = 0; - i--; - // FIXME: should it usb_sg_cancel() on INTERRUPT? - yield (); - break; - - /* no error? continue immediately. - * - * NOTE: to work better with UHCI (4K I/O buffer may - * need 3K of TDs) it may be good to limit how many - * URBs are queued at once; N milliseconds? - */ - case 0: - cpu_relax (); - break; - - /* fail any uncompleted urbs */ - default: - io->urbs [i]->status = retval; - dbg ("usb_sg_msg, submit --> %d", retval); - usb_sg_cancel (io); - } - spin_lock_irqsave (&io->lock, flags); - if (retval && io->status == -ECONNRESET) - io->status = retval; - } - spin_unlock_irqrestore (&io->lock, flags); - - /* OK, yes, this could be packaged as non-blocking. - * So could the submit loop above ... but it's easier to - * solve neither problem than to solve both! - */ - wait_for_completion (&io->complete); - - sg_clean (io); -} - -/** - * usb_sg_cancel - stop scatter/gather i/o issued by usb_sg_wait() - * @io: request block, initialized with usb_sg_init() - * - * This stops a request after it has been started by usb_sg_wait(). - * It can also prevents one initialized by usb_sg_init() from starting, - * so that call just frees resources allocated to the request. - */ -void usb_sg_cancel (struct usb_sg_request *io) -{ - unsigned long flags; - - spin_lock_irqsave (&io->lock, flags); - - /* shut everything down, if it didn't already */ - if (!io->status) { - int i; - - io->status = -ECONNRESET; - for (i = 0; i < io->entries; i++) { - int retval; - - if (!io->urbs [i]->dev) - continue; - retval = usb_unlink_urb (io->urbs [i]); - if (retval && retval != -EINPROGRESS) - warn ("usb_sg_cancel, unlink --> %d", retval); - // FIXME don't warn on "not yet submitted" error - } - } - spin_unlock_irqrestore (&io->lock, flags); -} -#endif -/*-------------------------------------------------------------------*/ - -/** - * usb_get_descriptor - issues a generic GET_DESCRIPTOR request - * @dev: the device whose descriptor is being retrieved - * @type: the descriptor type (USB_DT_*) - * @index: the number of the descriptor - * @buf: where to put the descriptor - * @size: how big is "buf"? - * Context: !in_interrupt () - * - * Gets a USB descriptor. Convenience functions exist to simplify - * getting some types of descriptors. Use - * usb_get_device_descriptor() for USB_DT_DEVICE, - * and usb_get_string() or usb_string() for USB_DT_STRING. - * Configuration descriptors (USB_DT_CONFIG) are part of the device - * structure, at least for the current configuration. - * In addition to a number of USB-standard descriptors, some - * devices also use class-specific or vendor-specific descriptors. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns the number of bytes received on success, or else the status code - * returned by the underlying usb_control_msg() call. - */ -int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size) -{ - int i = 5; - int result; - - memset(buf,0,size); // Make sure we parse really received data - - while (i--) { - /* retries if the returned length was 0; flakey device */ - if ((result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, - (type << 8) + index, 0, buf, size, - HZ * USB_CTRL_GET_TIMEOUT)) > 0 - || result == -EPIPE) - break; - } - return result; -} - -/** - * usb_get_string - gets a string descriptor - * @dev: the device whose string descriptor is being retrieved - * @langid: code for language chosen (from string descriptor zero) - * @index: the number of the descriptor - * @buf: where to put the string - * @size: how big is "buf"? - * Context: !in_interrupt () - * - * Retrieves a string, encoded using UTF-16LE (Unicode, 16 bits per character, - * in little-endian byte order). - * The usb_string() function will often be a convenient way to turn - * these strings into kernel-printable form. - * - * Strings may be referenced in device, configuration, interface, or other - * descriptors, and could also be used in vendor-specific ways. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns the number of bytes received on success, or else the status code - * returned by the underlying usb_control_msg() call. - */ -int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size) -{ - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, - (USB_DT_STRING << 8) + index, langid, buf, size, - HZ * USB_CTRL_GET_TIMEOUT); -} - -/** - * usb_get_device_descriptor - (re)reads the device descriptor - * @dev: the device whose device descriptor is being updated - * Context: !in_interrupt () - * - * Updates the copy of the device descriptor stored in the device structure, - * which dedicates space for this purpose. Note that several fields are - * converted to the host CPU's byte order: the USB version (bcdUSB), and - * vendors product and version fields (idVendor, idProduct, and bcdDevice). - * That lets device drivers compare against non-byteswapped constants. - * - * There's normally no need to use this call, although some devices - * will change their descriptors after events like updating firmware. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns the number of bytes received on success, or else the status code - * returned by the underlying usb_control_msg() call. - */ -int usb_get_device_descriptor(struct usb_device *dev) -{ - int ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, - sizeof(dev->descriptor)); - if (ret >= 0) { - le16_to_cpus(&dev->descriptor.bcdUSB); - le16_to_cpus(&dev->descriptor.idVendor); - le16_to_cpus(&dev->descriptor.idProduct); - le16_to_cpus(&dev->descriptor.bcdDevice); - } - return ret; -} - -/** - * usb_get_status - issues a GET_STATUS call - * @dev: the device whose status is being checked - * @type: USB_RECIP_*; for device, interface, or endpoint - * @target: zero (for device), else interface or endpoint number - * @data: pointer to two bytes of bitmap data - * Context: !in_interrupt () - * - * Returns device, interface, or endpoint status. Normally only of - * interest to see if the device is self powered, or has enabled the - * remote wakeup facility; or whether a bulk or interrupt endpoint - * is halted ("stalled"). - * - * Bits in these status bitmaps are set using the SET_FEATURE request, - * and cleared using the CLEAR_FEATURE request. The usb_clear_halt() - * function should be used to clear halt ("stall") status. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns the number of bytes received on success, or else the status code - * returned by the underlying usb_control_msg() call. - */ -int usb_get_status(struct usb_device *dev, int type, int target, void *data) -{ - return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_STATUS, USB_DIR_IN | type, 0, target, data, 2, - HZ * USB_CTRL_GET_TIMEOUT); -} - - -// hub-only!! ... and only exported for reset/reinit path. -// otherwise used internally, when setting up a config -void usb_set_maxpacket(struct usb_device *dev) -{ - int i, b; - - /* NOTE: affects all endpoints _except_ ep0 */ - for (i=0; iactconfig->desc.bNumInterfaces; i++) { - struct usb_interface *ifp = dev->actconfig->interface + i; - struct usb_host_interface *as = ifp->altsetting + ifp->act_altsetting; - struct usb_host_endpoint *ep = as->endpoint; - int e; - - for (e=0; edesc.bNumEndpoints; e++) { - struct usb_endpoint_descriptor *d; - d = &ep [e].desc; - b = d->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; - if ((d->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == - USB_ENDPOINT_XFER_CONTROL) { /* Control => bidirectional */ - dev->epmaxpacketout[b] = d->wMaxPacketSize; - dev->epmaxpacketin [b] = d->wMaxPacketSize; - } - else if (usb_endpoint_out(d->bEndpointAddress)) { - if (d->wMaxPacketSize > dev->epmaxpacketout[b]) - dev->epmaxpacketout[b] = d->wMaxPacketSize; - } - else { - if (d->wMaxPacketSize > dev->epmaxpacketin [b]) - dev->epmaxpacketin [b] = d->wMaxPacketSize; - } - } - } -} - -/** - * usb_clear_halt - tells device to clear endpoint halt/stall condition - * @dev: device whose endpoint is halted - * @pipe: endpoint "pipe" being cleared - * Context: !in_interrupt () - * - * This is used to clear halt conditions for bulk and interrupt endpoints, - * as reported by URB completion status. Endpoints that are halted are - * sometimes referred to as being "stalled". Such endpoints are unable - * to transmit or receive data until the halt status is cleared. Any URBs - * queued for such an endpoint should normally be unlinked by the driver - * before clearing the halt condition, as described in sections 5.7.5 - * and 5.8.5 of the USB 2.0 spec. - * - * Note that control and isochronous endpoints don't halt, although control - * endpoints report "protocol stall" (for unsupported requests) using the - * same status code used to report a true stall. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns zero on success, or else the status code returned by the - * underlying usb_control_msg() call. - */ -int usb_clear_halt(struct usb_device *dev, int pipe) -{ - int result; - int endp = usb_pipeendpoint(pipe); - - if (usb_pipein (pipe)) - endp |= USB_DIR_IN; - - /* we don't care if it wasn't halted first. in fact some devices - * (like some ibmcam model 1 units) seem to expect hosts to make - * this request for iso endpoints, which can't halt! - */ - result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0, - HZ * USB_CTRL_SET_TIMEOUT); - - /* don't un-halt or force to DATA0 except on success */ - if (result < 0) - return result; - - /* NOTE: seems like Microsoft and Apple don't bother verifying - * the clear "took", so some devices could lock up if you check... - * such as the Hagiwara FlashGate DUAL. So we won't bother. - * - * NOTE: make sure the logic here doesn't diverge much from - * the copy in usb-storage, for as long as we need two copies. - */ - - /* toggle was reset by the clear, then ep was reactivated */ - usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0); - usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)); - - return 0; -} - -/** - * usb_set_interface - Makes a particular alternate setting be current - * @dev: the device whose interface is being updated - * @interface: the interface being updated - * @alternate: the setting being chosen. - * Context: !in_interrupt () - * - * This is used to enable data transfers on interfaces that may not - * be enabled by default. Not all devices support such configurability. - * Only the driver bound to an interface may change its setting. - * - * Within any given configuration, each interface may have several - * alternative settings. These are often used to control levels of - * bandwidth consumption. For example, the default setting for a high - * speed interrupt endpoint may not send more than 64 bytes per microframe, - * while interrupt transfers of up to 3KBytes per microframe are legal. - * Also, isochronous endpoints may never be part of an - * interface's default setting. To access such bandwidth, alternate - * interface settings must be made current. - * - * Note that in the Linux USB subsystem, bandwidth associated with - * an endpoint in a given alternate setting is not reserved until an URB - * is submitted that needs that bandwidth. Some other operating systems - * allocate bandwidth early, when a configuration is chosen. - * - * This call is synchronous, and may not be used in an interrupt context. - * Also, drivers must not change altsettings while urbs are scheduled for - * endpoints in that interface; all such urbs must first be completed - * (perhaps forced by unlinking). - * - * Returns zero on success, or else the status code returned by the - * underlying usb_control_msg() call. - */ -int usb_set_interface(struct usb_device *dev, int interface, int alternate) -{ - struct usb_interface *iface; - struct usb_host_interface *iface_as; - int i, ret; - void (*disable)(struct usb_device *, int) = dev->bus->op->disable; - - iface = usb_ifnum_to_if(dev, interface); - if (!iface) { - warn("selecting invalid interface %d", interface); - return -EINVAL; - } - - /* 9.4.10 says devices don't need this, if the interface - only has one alternate setting */ - if (iface->num_altsetting == 1) { - dbg("ignoring set_interface for dev %d, iface %d, alt %d", - dev->devnum, interface, alternate); - return 0; - } - - if (alternate < 0 || alternate >= iface->num_altsetting) - return -EINVAL; - - if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, - iface->altsetting[alternate] - .desc.bAlternateSetting, - interface, NULL, 0, HZ * 5)) < 0) - return ret; - - /* FIXME drivers shouldn't need to replicate/bugfix the logic here - * when they implement async or easily-killable versions of this or - * other "should-be-internal" functions (like clear_halt). - * should hcd+usbcore postprocess control requests? - */ - - /* prevent submissions using previous endpoint settings */ - iface_as = iface->altsetting + iface->act_altsetting; - for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { - u8 ep = iface_as->endpoint [i].desc.bEndpointAddress; - int out = !(ep & USB_DIR_IN); - - /* clear out hcd state, then usbcore state */ - if (disable) - disable (dev, ep); - ep &= USB_ENDPOINT_NUMBER_MASK; - (out ? dev->epmaxpacketout : dev->epmaxpacketin ) [ep] = 0; - } - iface->act_altsetting = alternate; - - /* 9.1.1.5: reset toggles for all endpoints affected by this iface-as - * - * Note: - * Despite EP0 is always present in all interfaces/AS, the list of - * endpoints from the descriptor does not contain EP0. Due to its - * omnipresence one might expect EP0 being considered "affected" by - * any SetInterface request and hence assume toggles need to be reset. - * However, EP0 toggles are re-synced for every individual transfer - * during the SETUP stage - hence EP0 toggles are "don't care" here. - * (Likewise, EP0 never "halts" on well designed devices.) - */ - - iface_as = &iface->altsetting[alternate]; - for (i = 0; i < iface_as->desc.bNumEndpoints; i++) { - u8 ep = iface_as->endpoint[i].desc.bEndpointAddress; - int out = !(ep & USB_DIR_IN); - - ep &= USB_ENDPOINT_NUMBER_MASK; - usb_settoggle (dev, ep, out, 0); - (out ? dev->epmaxpacketout : dev->epmaxpacketin) [ep] - = iface_as->endpoint [i].desc.wMaxPacketSize; - usb_endpoint_running (dev, ep, out); - } - - return 0; -} - -/** - * usb_set_configuration - Makes a particular device setting be current - * @dev: the device whose configuration is being updated - * @configuration: the configuration being chosen. - * Context: !in_interrupt () - * - * This is used to enable non-default device modes. Not all devices - * support this kind of configurability. By default, configuration - * zero is selected after enumeration; many devices only have a single - * configuration. - * - * USB devices may support one or more configurations, which affect - * power consumption and the functionality available. For example, - * the default configuration is limited to using 100mA of bus power, - * so that when certain device functionality requires more power, - * and the device is bus powered, that functionality will be in some - * non-default device configuration. Other device modes may also be - * reflected as configuration options, such as whether two ISDN - * channels are presented as independent 64Kb/s interfaces or as one - * bonded 128Kb/s interface. - * - * Note that USB has an additional level of device configurability, - * associated with interfaces. That configurability is accessed using - * usb_set_interface(). - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns zero on success, or else the status code returned by the - * underlying usb_control_msg() call. - */ -int usb_set_configuration(struct usb_device *dev, int configuration) -{ - int i, ret; - struct usb_host_config *cp = NULL; - void (*disable)(struct usb_device *, int) = dev->bus->op->disable; - - for (i=0; idescriptor.bNumConfigurations; i++) { - if (dev->config[i].desc.bConfigurationValue == configuration) { - cp = &dev->config[i]; - break; - } - } - if ((!cp && configuration != 0) || (cp && configuration == 0)) { - warn("selecting invalid configuration %d", configuration); - return -EINVAL; - } - - /* if it's already configured, clear out old state first. */ - if (dev->state != USB_STATE_ADDRESS && disable) { - for (i = 1 /* skip ep0 */; i < 15; i++) { - disable (dev, i); - disable (dev, USB_DIR_IN | i); - } - } - dev->toggle[0] = dev->toggle[1] = 0; - dev->halted[0] = dev->halted[1] = 0; - dev->state = USB_STATE_ADDRESS; - - if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_SET_CONFIGURATION, 0, configuration, 0, - NULL, 0, HZ * USB_CTRL_SET_TIMEOUT)) < 0) - return ret; - if (configuration) - dev->state = USB_STATE_CONFIGURED; - dev->actconfig = cp; - - /* reset more hc/hcd endpoint state */ - usb_set_maxpacket(dev); - - return 0; -} - - -/** - * usb_string - returns ISO 8859-1 version of a string descriptor - * @dev: the device whose string descriptor is being retrieved - * @index: the number of the descriptor - * @buf: where to put the string - * @size: how big is "buf"? - * Context: !in_interrupt () - * - * This converts the UTF-16LE encoded strings returned by devices, from - * usb_get_string_descriptor(), to null-terminated ISO-8859-1 encoded ones - * that are more usable in most kernel contexts. Note that all characters - * in the chosen descriptor that can't be encoded using ISO-8859-1 - * are converted to the question mark ("?") character, and this function - * chooses strings in the first language supported by the device. - * - * The ASCII (or, redundantly, "US-ASCII") character set is the seven-bit - * subset of ISO 8859-1. ISO-8859-1 is the eight-bit subset of Unicode, - * and is appropriate for use many uses of English and several other - * Western European languages. (But it doesn't include the "Euro" symbol.) - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Returns length of the string (>= 0) or usb_control_msg status (< 0). - */ -int usb_string(struct usb_device *dev, int index, char *buf, size_t size) -{ - unsigned char *tbuf; - int err, len; - unsigned int u, idx; - - if (size <= 0 || !buf || !index) - return -EINVAL; - buf[0] = 0; - tbuf = kmalloc(256, GFP_KERNEL); - if (!tbuf) - return -ENOMEM; - - /* get langid for strings if it's not yet known */ - if (!dev->have_langid) { - err = usb_get_string(dev, 0, 0, tbuf, 4); - if (err < 0) { - err("error getting string descriptor 0 (error=%d)", err); - goto errout; - } else if (tbuf[0] < 4) { - err("string descriptor 0 too short"); - err = -EINVAL; - goto errout; - } else { - dev->have_langid = -1; - dev->string_langid = tbuf[2] | (tbuf[3]<< 8); - /* always use the first langid listed */ - dbg("USB device number %d default language ID 0x%x", - dev->devnum, dev->string_langid); - } - } - - /* - * ask for the length of the string - */ - - err = usb_get_string(dev, dev->string_langid, index, tbuf, 2); - if(err<2) - goto errout; - len=tbuf[0]; - - err = usb_get_string(dev, dev->string_langid, index, tbuf, len); - if (err < 0) - goto errout; - - size--; /* leave room for trailing NULL char in output buffer */ - for (idx = 0, u = 2; u < err; u += 2) { - if (idx >= size) - break; - if (tbuf[u+1]) /* high byte */ - buf[idx++] = '?'; /* non ISO-8859-1 character */ - else - buf[idx++] = tbuf[u]; - } - buf[idx] = 0; - err = idx; - - errout: - kfree(tbuf); - return err; -} - -// synchronous request completion model -EXPORT_SYMBOL(usb_control_msg); -EXPORT_SYMBOL(usb_bulk_msg); - -EXPORT_SYMBOL(usb_sg_init); -EXPORT_SYMBOL(usb_sg_cancel); -EXPORT_SYMBOL(usb_sg_wait); - -// synchronous control message convenience routines -EXPORT_SYMBOL(usb_get_descriptor); -EXPORT_SYMBOL(usb_get_device_descriptor); -EXPORT_SYMBOL(usb_get_status); -EXPORT_SYMBOL(usb_get_string); -EXPORT_SYMBOL(usb_string); -EXPORT_SYMBOL(usb_clear_halt); -EXPORT_SYMBOL(usb_set_configuration); -EXPORT_SYMBOL(usb_set_interface); - diff --git a/lib/usb/core/urb.c b/lib/usb/core/urb.c deleted file mode 100644 index 6c5eb703f..000000000 --- a/lib/usb/core/urb.c +++ /dev/null @@ -1,423 +0,0 @@ -#if 0 -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif -#include -#include "hcd.h" -#else -#include "../usb_wrapper.h" -#include "hcd.h" -#endif - -/** - * usb_init_urb - initializes a urb so that it can be used by a USB driver - * @urb: pointer to the urb to initialize - * - * Initializes a urb so that the USB subsystem can use it properly. - * - * If a urb is created with a call to usb_alloc_urb() it is not - * necessary to call this function. Only use this if you allocate the - * space for a struct urb on your own. If you call this function, be - * careful when freeing the memory for your urb that it is no longer in - * use by the USB core. - * - * Only use this function if you _really_ understand what you are doing. - */ -void usb_init_urb(struct urb *urb) -{ - if (urb) { - memset(urb, 0, sizeof(*urb)); - urb->count = (atomic_t)ATOMIC_INIT(1); - spin_lock_init(&urb->lock); - } -} - -/** - * usb_alloc_urb - creates a new urb for a USB driver to use - * @iso_packets: number of iso packets for this urb - * @mem_flags: the type of memory to allocate, see kmalloc() for a list of - * valid options for this. - * - * Creates an urb for the USB driver to use, initializes a few internal - * structures, incrementes the usage counter, and returns a pointer to it. - * - * If no memory is available, NULL is returned. - * - * If the driver want to use this urb for interrupt, control, or bulk - * endpoints, pass '0' as the number of iso packets. - * - * The driver must call usb_free_urb() when it is finished with the urb. - */ -struct urb *usb_alloc_urb(int iso_packets, int mem_flags) -{ - struct urb *urb; - - urb = (struct urb *)kmalloc(sizeof(struct urb) + - iso_packets * sizeof(struct usb_iso_packet_descriptor), - mem_flags); - if (!urb) { - err("alloc_urb: kmalloc failed"); - return NULL; - } - usb_init_urb(urb); - return urb; -} - -/** - * usb_free_urb - frees the memory used by a urb when all users of it are finished - * @urb: pointer to the urb to free - * - * Must be called when a user of a urb is finished with it. When the last user - * of the urb calls this function, the memory of the urb is freed. - * - * Note: The transfer buffer associated with the urb is not freed, that must be - * done elsewhere. - */ -void usb_free_urb(struct urb *urb) -{ - if (urb) - if (atomic_dec_and_test(&urb->count)) - { - kfree(urb); - } -} - -/** - * usb_get_urb - increments the reference count of the urb - * @urb: pointer to the urb to modify - * - * This must be called whenever a urb is transferred from a device driver to a - * host controller driver. This allows proper reference counting to happen - * for urbs. - * - * A pointer to the urb with the incremented reference counter is returned. - */ -struct urb * usb_get_urb(struct urb *urb) -{ - if (urb) { - atomic_inc(&urb->count); - return urb; - } else - return NULL; -} - - -/*-------------------------------------------------------------------*/ - -/** - * usb_submit_urb - issue an asynchronous transfer request for an endpoint - * @urb: pointer to the urb describing the request - * @mem_flags: the type of memory to allocate, see kmalloc() for a list - * of valid options for this. - * - * This submits a transfer request, and transfers control of the URB - * describing that request to the USB subsystem. Request completion will - * be indicated later, asynchronously, by calling the completion handler. - * The three types of completion are success, error, and unlink - * (also called "request cancellation"). - * URBs may be submitted in interrupt context. - * - * The caller must have correctly initialized the URB before submitting - * it. Functions such as usb_fill_bulk_urb() and usb_fill_control_urb() are - * available to ensure that most fields are correctly initialized, for - * the particular kind of transfer, although they will not initialize - * any transfer flags. - * - * Successful submissions return 0; otherwise this routine returns a - * negative error number. If the submission is successful, the complete() - * callback from the urb will be called exactly once, when the USB core and - * host controller driver are finished with the urb. When the completion - * function is called, control of the URB is returned to the device - * driver which issued the request. The completion handler may then - * immediately free or reuse that URB. - * - * For control endpoints, the synchronous usb_control_msg() call is - * often used (in non-interrupt context) instead of this call. - * That is often used through convenience wrappers, for the requests - * that are standardized in the USB 2.0 specification. For bulk - * endpoints, a synchronous usb_bulk_msg() call is available. - * - * Request Queuing: - * - * URBs may be submitted to endpoints before previous ones complete, to - * minimize the impact of interrupt latencies and system overhead on data - * throughput. This is required for continuous isochronous data streams, - * and may also be required for some kinds of interrupt transfers. Such - * queueing also maximizes bandwidth utilization by letting USB controllers - * start work on later requests before driver software has finished the - * completion processing for earlier requests. - * - * Bulk and Isochronous URBs may always be queued. At this writing, all - * mainstream host controller drivers support queueing for control and - * interrupt transfer requests. - * - * Reserved Bandwidth Transfers: - * - * Periodic transfers (interrupt or isochronous) are performed repeatedly, - * using the interval specified in the urb. Submitting the first urb to - * the endpoint reserves the bandwidth necessary to make those transfers. - * If the USB subsystem can't allocate sufficient bandwidth to perform - * the periodic request, submitting such a periodic request should fail. - * - * Device drivers must explicitly request that repetition, by ensuring that - * some URB is always on the endpoint's queue (except possibly for short - * periods during completion callacks). When there is no longer an urb - * queued, the endpoint's bandwidth reservation is canceled. This means - * drivers can use their completion handlers to ensure they keep bandwidth - * they need, by reinitializing and resubmitting the just-completed urb - * until the driver longer needs that periodic bandwidth. - * - * Memory Flags: - * - * The general rules for how to decide which mem_flags to use - * are the same as for kmalloc. There are four - * different possible values; GFP_KERNEL, GFP_NOFS, GFP_NOIO and - * GFP_ATOMIC. - * - * GFP_NOFS is not ever used, as it has not been implemented yet. - * - * GFP_ATOMIC is used when - * (a) you are inside a completion handler, an interrupt, bottom half, - * tasklet or timer, or - * (b) you are holding a spinlock or rwlock (does not apply to - * semaphores), or - * (c) current->state != TASK_RUNNING, this is the case only after - * you've changed it. - * - * GFP_NOIO is used in the block io path and error handling of storage - * devices. - * - * All other situations use GFP_KERNEL. - * - * Some more specific rules for mem_flags can be inferred, such as - * (1) start_xmit, timeout, and receive methods of network drivers must - * use GFP_ATOMIC (they are called with a spinlock held); - * (2) queuecommand methods of scsi drivers must use GFP_ATOMIC (also - * called with a spinlock held); - * (3) If you use a kernel thread with a network driver you must use - * GFP_NOIO, unless (b) or (c) apply; - * (4) after you have done a down() you can use GFP_KERNEL, unless (b) or (c) - * apply or your are in a storage driver's block io path; - * (5) USB probe and disconnect can use GFP_KERNEL unless (b) or (c) apply; and - * (6) changing firmware on a running storage or net device uses - * GFP_NOIO, unless b) or c) apply - * - */ -int usb_submit_urb(struct urb *urb, int mem_flags) -{ - int pipe, temp, max; - struct usb_device *dev; - struct usb_operations *op; - int is_out; -// printk("sub dev %p bus %p num %i op %p sub %p\n", -// urb->dev, urb->dev->bus,urb->dev->devnum,urb->dev->bus->op, urb->dev->bus->op->submit_urb); - if (!urb || urb->hcpriv || !urb->complete) - return -EINVAL; - if (!(dev = urb->dev) || - (dev->state < USB_STATE_DEFAULT) || - (!dev->bus) || (dev->devnum <= 0)) - return -ENODEV; - if (!(op = dev->bus->op) || !op->submit_urb) - return -ENODEV; - - urb->status = -EINPROGRESS; - urb->actual_length = 0; - urb->bandwidth = 0; - - /* Lots of sanity checks, so HCDs can rely on clean data - * and don't need to duplicate tests - */ - pipe = urb->pipe; - temp = usb_pipetype (pipe); - is_out = usb_pipeout (pipe); - - if (!usb_pipecontrol (pipe) && dev->state < USB_STATE_CONFIGURED) - return -ENODEV; - - /* (actually HCDs may need to duplicate this, endpoint might yet - * stall due to queued bulk/intr transactions that complete after - * we check) - */ - if (usb_endpoint_halted (dev, usb_pipeendpoint (pipe), is_out)) - return -EPIPE; - - /* FIXME there should be a sharable lock protecting us against - * config/altsetting changes and disconnects, kicking in here. - * (here == before maxpacket, and eventually endpoint type, - * checks get made.) - */ - - max = usb_maxpacket (dev, pipe, is_out); - if (max <= 0) { - dbg ("%s: bogus endpoint %d-%s on usb-%s-%s (bad maxpacket %d)", - __FUNCTION__, - usb_pipeendpoint (pipe), is_out ? "OUT" : "IN", - dev->bus->bus_name, dev->devpath, - max); - return -EMSGSIZE; - } - - /* periodic transfers limit size per frame/uframe, - * but drivers only control those sizes for ISO. - * while we're checking, initialize return status. - */ - if (temp == PIPE_ISOCHRONOUS) { - int n, len; - - /* "high bandwidth" mode, 1-3 packets/uframe? */ - if (dev->speed == USB_SPEED_HIGH) { - int mult = 1 + ((max >> 11) & 0x03); - max &= 0x03ff; - max *= mult; - } - - if (urb->number_of_packets <= 0) - return -EINVAL; - for (n = 0; n < urb->number_of_packets; n++) { - len = urb->iso_frame_desc [n].length; - if (len < 0 || len > max) - return -EMSGSIZE; - urb->iso_frame_desc [n].status = -EXDEV; - urb->iso_frame_desc [n].actual_length = 0; - } - } - - /* the I/O buffer must be mapped/unmapped, except when length=0 */ - if (urb->transfer_buffer_length < 0) - return -EMSGSIZE; - -#ifdef DEBUG - /* stuff that drivers shouldn't do, but which shouldn't - * cause problems in HCDs if they get it wrong. - */ - { - unsigned int orig_flags = urb->transfer_flags; - unsigned int allowed; - - /* enforce simple/standard policy */ - allowed = URB_ASYNC_UNLINK; // affects later unlinks - allowed |= URB_NO_DMA_MAP; - allowed |= URB_NO_INTERRUPT; - switch (temp) { - case PIPE_BULK: - if (is_out) - allowed |= URB_ZERO_PACKET; - /* FALLTHROUGH */ - case PIPE_CONTROL: - allowed |= URB_NO_FSBR; /* only affects UHCI */ - /* FALLTHROUGH */ - default: /* all non-iso endpoints */ - if (!is_out) - allowed |= URB_SHORT_NOT_OK; - break; - case PIPE_ISOCHRONOUS: - allowed |= URB_ISO_ASAP; - break; - } - urb->transfer_flags &= allowed; - - /* fail if submitter gave bogus flags */ - if (urb->transfer_flags != orig_flags) { - err ("BOGUS urb flags, %x --> %x", - orig_flags, urb->transfer_flags); - return -EINVAL; - } - } -#endif - /* - * Force periodic transfer intervals to be legal values that are - * a power of two (so HCDs don't need to). - * - * FIXME want bus->{intr,iso}_sched_horizon values here. Each HC - * supports different values... this uses EHCI/UHCI defaults (and - * EHCI can use smaller non-default values). - */ - switch (temp) { - case PIPE_ISOCHRONOUS: - case PIPE_INTERRUPT: - /* too small? */ - if (urb->interval <= 0) - return -EINVAL; - /* too big? */ - switch (dev->speed) { - case USB_SPEED_HIGH: /* units are microframes */ - // NOTE usb handles 2^15 - if (urb->interval > (1024 * 8)) - urb->interval = 1024 * 8; - temp = 1024 * 8; - break; - case USB_SPEED_FULL: /* units are frames/msec */ - case USB_SPEED_LOW: - if (temp == PIPE_INTERRUPT) { - if (urb->interval > 255) - return -EINVAL; - // NOTE ohci only handles up to 32 - temp = 128; - } else { - if (urb->interval > 1024) - urb->interval = 1024; - // NOTE usb and ohci handle up to 2^15 - temp = 1024; - } - break; - default: - return -EINVAL; - } - /* power of two? */ - while (temp > urb->interval) - temp >>= 1; - urb->interval = temp; - } - - return op->submit_urb (urb, mem_flags); -} - -/*-------------------------------------------------------------------*/ - -/** - * usb_unlink_urb - abort/cancel a transfer request for an endpoint - * @urb: pointer to urb describing a previously submitted request - * - * This routine cancels an in-progress request. The requests's - * completion handler will be called with a status code indicating - * that the request has been canceled, and that control of the URB - * has been returned to that device driver. - * - * When the URB_ASYNC_UNLINK transfer flag for the URB is clear, this - * request is synchronous. Success is indicated by returning zero, - * at which time the urb will have been unlinked, - * and the completion function will see status -ENOENT. Failure is - * indicated by any other return value. This mode may not be used - * when unlinking an urb from an interrupt context, such as a bottom - * half or a completion handler, - * - * When the URB_ASYNC_UNLINK transfer flag for the URB is set, this - * request is asynchronous. Success is indicated by returning -EINPROGRESS, - * at which time the urb will normally not have been unlinked, - * and the completion function will see status -ECONNRESET. Failure is - * indicated by any other return value. - */ -int usb_unlink_urb(struct urb *urb) -{ - if (urb && urb->dev && urb->dev->bus && urb->dev->bus->op) - return urb->dev->bus->op->unlink_urb(urb); - else - return -ENODEV; -} - -EXPORT_SYMBOL(usb_init_urb); -EXPORT_SYMBOL(usb_alloc_urb); -EXPORT_SYMBOL(usb_free_urb); -EXPORT_SYMBOL(usb_get_urb); -EXPORT_SYMBOL(usb_submit_urb); -EXPORT_SYMBOL(usb_unlink_urb); - diff --git a/lib/usb/core/usb-debug.c b/lib/usb/core/usb-debug.c deleted file mode 100644 index a6a6160e0..000000000 --- a/lib/usb/core/usb-debug.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * debug.c - USB debug helper routines. - * - * I just want these out of the way where they aren't in your - * face, but so that you can still use them.. - */ -#define CONFIG_USB_DEBUG -#if 0 -#include -#include -#include -#include -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif -#include -#else -#include "../usb_wrapper.h" -#endif - -static void usb_show_endpoint(struct usb_host_endpoint *endpoint) -{ - usb_show_endpoint_descriptor(&endpoint->desc); -} - -static void usb_show_interface(struct usb_host_interface *altsetting) -{ - int i; - - usb_show_interface_descriptor(&altsetting->desc); - - for (i = 0; i < altsetting->desc.bNumEndpoints; i++) - usb_show_endpoint(altsetting->endpoint + i); -} - -static void usb_show_config(struct usb_host_config *config) -{ - int i, j; - struct usb_interface *ifp; - - usb_show_config_descriptor(&config->desc); - for (i = 0; i < config->desc.bNumInterfaces; i++) { - ifp = config->interface + i; - - if (!ifp) - break; - - printk("\n Interface: %d\n", i); - for (j = 0; j < ifp->num_altsetting; j++) - usb_show_interface(ifp->altsetting + j); - } -} - -void usb_show_device(struct usb_device *dev) -{ - int i; - - usb_show_device_descriptor(&dev->descriptor); - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) - usb_show_config(dev->config + i); -} - -/* - * Parse and show the different USB descriptors. - */ -void usb_show_device_descriptor(struct usb_device_descriptor *desc) -{ - if (!desc) - { - printk("Invalid USB device descriptor (NULL POINTER)\n"); - return; - } - printk(" Length = %2d%s\n", desc->bLength, - desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)"); - printk(" DescriptorType = %02x\n", desc->bDescriptorType); - - printk(" USB version = %x.%02x\n", - desc->bcdUSB >> 8, desc->bcdUSB & 0xff); - printk(" Vendor:Product = %04x:%04x\n", - desc->idVendor, desc->idProduct); - printk(" MaxPacketSize0 = %d\n", desc->bMaxPacketSize0); - printk(" NumConfigurations = %d\n", desc->bNumConfigurations); - printk(" Device version = %x.%02x\n", - desc->bcdDevice >> 8, desc->bcdDevice & 0xff); - - printk(" Device Class:SubClass:Protocol = %02x:%02x:%02x\n", - desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol); - switch (desc->bDeviceClass) { - case 0: - printk(" Per-interface classes\n"); - break; - case USB_CLASS_AUDIO: - printk(" Audio device class\n"); - break; - case USB_CLASS_COMM: - printk(" Communications class\n"); - break; - case USB_CLASS_HID: - printk(" Human Interface Devices class\n"); - break; - case USB_CLASS_PRINTER: - printk(" Printer device class\n"); - break; - case USB_CLASS_MASS_STORAGE: - printk(" Mass Storage device class\n"); - break; - case USB_CLASS_HUB: - printk(" Hub device class\n"); - break; - case USB_CLASS_VENDOR_SPEC: - printk(" Vendor class\n"); - break; - default: - printk(" Unknown class\n"); - } -} - -void usb_show_config_descriptor(struct usb_config_descriptor *desc) -{ - printk("Configuration:\n"); - printk(" bLength = %4d%s\n", desc->bLength, - desc->bLength == USB_DT_CONFIG_SIZE ? "" : " (!!!)"); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" wTotalLength = %04x\n", desc->wTotalLength); - printk(" bNumInterfaces = %02x\n", desc->bNumInterfaces); - printk(" bConfigurationValue = %02x\n", desc->bConfigurationValue); - printk(" iConfiguration = %02x\n", desc->iConfiguration); - printk(" bmAttributes = %02x\n", desc->bmAttributes); - printk(" bMaxPower = %4dmA\n", desc->bMaxPower * 2); -} - -void usb_show_interface_descriptor(struct usb_interface_descriptor *desc) -{ - printk(" Alternate Setting: %2d\n", desc->bAlternateSetting); - printk(" bLength = %4d%s\n", desc->bLength, - desc->bLength == USB_DT_INTERFACE_SIZE ? "" : " (!!!)"); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" bInterfaceNumber = %02x\n", desc->bInterfaceNumber); - printk(" bAlternateSetting = %02x\n", desc->bAlternateSetting); - printk(" bNumEndpoints = %02x\n", desc->bNumEndpoints); - printk(" bInterface Class:SubClass:Protocol = %02x:%02x:%02x\n", - desc->bInterfaceClass, desc->bInterfaceSubClass, desc->bInterfaceProtocol); - printk(" iInterface = %02x\n", desc->iInterface); -} - -void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc) -{ - char *LengthCommentString = (desc->bLength == - USB_DT_ENDPOINT_AUDIO_SIZE) ? " (Audio)" : (desc->bLength == - USB_DT_ENDPOINT_SIZE) ? "" : " (!!!)"; - char *EndpointType[4] = { "Control", "Isochronous", "Bulk", "Interrupt" }; - - printk(" Endpoint:\n"); - printk(" bLength = %4d%s\n", - desc->bLength, LengthCommentString); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" bEndpointAddress = %02x (%s)\n", desc->bEndpointAddress, - (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == - USB_ENDPOINT_XFER_CONTROL ? "i/o" : - (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? "in" : "out"); - printk(" bmAttributes = %02x (%s)\n", desc->bmAttributes, - EndpointType[USB_ENDPOINT_XFERTYPE_MASK & desc->bmAttributes]); - printk(" wMaxPacketSize = %04x\n", desc->wMaxPacketSize); - printk(" bInterval = %02x\n", desc->bInterval); - - /* Audio extensions to the endpoint descriptor */ - if (desc->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) { - printk(" bRefresh = %02x\n", desc->bRefresh); - printk(" bSynchAddress = %02x\n", desc->bSynchAddress); - } -} - -void usb_show_string(struct usb_device *dev, char *id, int index) -{ - char *buf; - - if (!index) - return; - if (!(buf = kmalloc(256, GFP_KERNEL))) - return; - if (usb_string(dev, index, buf, 256) > 0) - dev_printk(KERN_INFO, &dev->dev, "%s: %s\n", id, buf); - kfree(buf); -} - -void usb_dump_urb (struct urb *urb) -{ - printk ("urb :%p\n", urb); - printk ("dev :%p\n", urb->dev); - printk ("pipe :%08X\n", urb->pipe); - printk ("status :%d\n", urb->status); - printk ("transfer_flags :%08X\n", urb->transfer_flags); - printk ("transfer_buffer :%p\n", urb->transfer_buffer); - printk ("transfer_buffer_length:%d\n", urb->transfer_buffer_length); - printk ("actual_length :%d\n", urb->actual_length); - printk ("setup_packet :%p\n", urb->setup_packet); - printk ("start_frame :%d\n", urb->start_frame); - printk ("number_of_packets :%d\n", urb->number_of_packets); - printk ("interval :%d\n", urb->interval); - printk ("error_count :%d\n", urb->error_count); - printk ("context :%p\n", urb->context); - printk ("complete :%p\n", urb->complete); -} - diff --git a/lib/usb/core/usb.c b/lib/usb/core/usb.c deleted file mode 100644 index 28b8ae0e2..000000000 --- a/lib/usb/core/usb.c +++ /dev/null @@ -1,1596 +0,0 @@ -/* - * drivers/usb/usb.c - * - * (C) Copyright Linus Torvalds 1999 - * (C) Copyright Johannes Erdfelt 1999-2001 - * (C) Copyright Andreas Gal 1999 - * (C) Copyright Gregory P. Smith 1999 - * (C) Copyright Deti Fliegl 1999 (new USB architecture) - * (C) Copyright Randy Dunlap 2000 - * (C) Copyright David Brownell 2000-2001 (kernel hotplug, usb_device_id, - more docs, etc) - * (C) Copyright Yggdrasil Computing, Inc. 2000 - * (usb_device_id matching changes by Adam J. Richter) - * (C) Copyright Greg Kroah-Hartman 2002-2003 - * - * NOTE! This is not actually a driver at all, rather this is - * just a collection of helper routines that implement the - * generic USB things that the real drivers can use.. - * - * Think of this as a "USB library" rather than anything else. - * It should be considered a slave, with no callbacks. Callbacks - * are evil. - */ - -#if 0 -#include - -#ifdef CONFIG_USB_DEBUG - #define DEBUG -#else - #undef DEBUG -#endif - -#include -#include -#include -#include -#include /* for in_interrupt() */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "hcd.h" -#include "usb.h" -#else -#include "../usb_wrapper.h" -#include "hcd.h" -#endif - - -extern int usb_hub_init(void); -extern void usb_hub_cleanup(void); -extern int usb_major_init(void); -extern void usb_major_cleanup(void); - - -int nousb; /* Disable USB when built into kernel image */ - /* Not honored on modular build */ - - -static int generic_probe (struct device *dev) -{ - return 0; -} -static int generic_remove (struct device *dev) -{ - return 0; -} - -static struct device_driver usb_generic_driver = { - .name = "usb", - .bus = &usb_bus_type, - .probe = generic_probe, - .remove = generic_remove, -}; - -static int usb_generic_driver_data; - -/* needs to be called with BKL held */ -int usb_device_probe(struct device *dev) -{ - struct usb_interface * intf = to_usb_interface(dev); - struct usb_driver * driver = to_usb_driver(dev->driver); - const struct usb_device_id *id; - int error = -ENODEV; - - dev_dbg(dev, "%s\n", __FUNCTION__); - - if (!driver->probe) - return error; - - id = usb_match_id (intf, driver->id_table); - if (id) { - dev_dbg (dev, "%s - got id\n", __FUNCTION__); - down (&driver->serialize); - error = driver->probe (intf, id); - up (&driver->serialize); - } - if (!error) - intf->driver = driver; - - return error; -} - -int usb_device_remove(struct device *dev) -{ - struct usb_interface *intf; - struct usb_driver *driver; - - intf = list_entry(dev,struct usb_interface,dev); - driver = to_usb_driver(dev->driver); - - down(&driver->serialize); - - if (intf->driver && intf->driver->disconnect) - intf->driver->disconnect(intf); - - /* if driver->disconnect didn't release the interface */ - if (intf->driver) - usb_driver_release_interface(driver, intf); - - up(&driver->serialize); - - return 0; -} - -/** - * usb_register - register a USB driver - * @new_driver: USB operations for the driver - * - * Registers a USB driver with the USB core. The list of unattached - * interfaces will be rescanned whenever a new driver is added, allowing - * the new driver to attach to any recognized devices. - * Returns a negative error code on failure and 0 on success. - * - * NOTE: if you want your driver to use the USB major number, you must call - * usb_register_dev() to enable that functionality. This function no longer - * takes care of that. - */ -int usb_register(struct usb_driver *new_driver) -{ - int retval = 0; - - if (nousb) - return -ENODEV; - - new_driver->driver.name = (char *)new_driver->name; - new_driver->driver.bus = &usb_bus_type; - new_driver->driver.probe = usb_device_probe; - new_driver->driver.remove = usb_device_remove; - - init_MUTEX(&new_driver->serialize); - - retval = driver_register(&new_driver->driver); - - if (!retval) { - info("registered new driver %s", new_driver->name); - usbfs_update_special(); - } else { - err("problem %d when registering driver %s", - retval, new_driver->name); - } - - return retval; -} - -/** - * usb_deregister - unregister a USB driver - * @driver: USB operations of the driver to unregister - * Context: !in_interrupt (), must be called with BKL held - * - * Unlinks the specified driver from the internal USB driver list. - * - * NOTE: If you called usb_register_dev(), you still need to call - * usb_deregister_dev() to clean up your driver's allocated minor numbers, - * this * call will no longer do it for you. - */ -void usb_deregister(struct usb_driver *driver) -{ - info("deregistering driver %s", driver->name); - - driver_unregister (&driver->driver); - - usbfs_update_special(); -} - -/** - * usb_ifnum_to_if - get the interface object with a given interface number (usbcore-internal) - * @dev: the device whose current configuration is considered - * @ifnum: the desired interface - * - * This walks the device descriptor for the currently active configuration - * and returns a pointer to the interface with that particular interface - * number, or null. - * - * Note that configuration descriptors are not required to assign interface - * numbers sequentially, so that it would be incorrect to assume that - * the first interface in that descriptor corresponds to interface zero. - * This routine helps device drivers avoid such mistakes. - * However, you should make sure that you do the right thing with any - * alternate settings available for this interfaces. - */ -struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) -{ - int i; - - for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) - if (dev->actconfig->interface[i].altsetting[0] - .desc.bInterfaceNumber == ifnum) - return &dev->actconfig->interface[i]; - - return NULL; -} - -/** - * usb_epnum_to_ep_desc - get the endpoint object with a given endpoint number - * @dev: the device whose current configuration is considered - * @epnum: the desired endpoint - * - * This walks the device descriptor for the currently active configuration, - * and returns a pointer to the endpoint with that particular endpoint - * number, or null. - * - * Note that interface descriptors are not required to assign endpont - * numbers sequentially, so that it would be incorrect to assume that - * the first endpoint in that descriptor corresponds to interface zero. - * This routine helps device drivers avoid such mistakes. - */ -struct usb_endpoint_descriptor * -usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum) -{ - int i, j, k; - - for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) - for (j = 0; j < dev->actconfig->interface[i].num_altsetting; j++) - for (k = 0; k < dev->actconfig->interface[i] - .altsetting[j].desc.bNumEndpoints; k++) - if (epnum == dev->actconfig->interface[i] - .altsetting[j].endpoint[k] - .desc.bEndpointAddress) - return &dev->actconfig->interface[i] - .altsetting[j].endpoint[k] - .desc; - - return NULL; -} - -/** - * usb_driver_claim_interface - bind a driver to an interface - * @driver: the driver to be bound - * @iface: the interface to which it will be bound - * @priv: driver data associated with that interface - * - * This is used by usb device drivers that need to claim more than one - * interface on a device when probing (audio and acm are current examples). - * No device driver should directly modify internal usb_interface or - * usb_device structure members. - * - * Few drivers should need to use this routine, since the most natural - * way to bind to an interface is to return the private data from - * the driver's probe() method. Any driver that does use this must - * first be sure that no other driver has claimed the interface, by - * checking with usb_interface_claimed(). - */ -void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv) -{ - if (!iface || !driver) - return; - - // FIXME change API to report an error in this case - if (iface->driver) - err ("%s driver booted %s off interface %p", - driver->name, iface->driver->name, iface); - else - dbg("%s driver claimed interface %p", driver->name, iface); - - iface->driver = driver; - usb_set_intfdata(iface, priv); -} - -/** - * usb_interface_claimed - returns true iff an interface is claimed - * @iface: the interface being checked - * - * This should be used by drivers to check other interfaces to see if - * they are available or not. If another driver has claimed the interface, - * they may not claim it. Otherwise it's OK to claim it using - * usb_driver_claim_interface(). - * - * Returns true (nonzero) iff the interface is claimed, else false (zero). - */ -int usb_interface_claimed(struct usb_interface *iface) -{ - if (!iface) - return 0; - - return (iface->driver != NULL); -} /* usb_interface_claimed() */ - -/** - * usb_driver_release_interface - unbind a driver from an interface - * @driver: the driver to be unbound - * @iface: the interface from which it will be unbound - * - * This should be used by drivers to release their claimed interfaces. - * It is normally called in their disconnect() methods, and only for - * drivers that bound to more than one interface in their probe(). - * - * When the USB subsystem disconnect()s a driver from some interface, - * it automatically invokes this method for that interface. That - * means that even drivers that used usb_driver_claim_interface() - * usually won't need to call this. - */ -void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface) -{ - /* this should never happen, don't release something that's not ours */ - if (!iface || iface->driver != driver) - return; - - iface->driver = NULL; - usb_set_intfdata(iface, NULL); -} - -/** - * usb_match_id - find first usb_device_id matching device or interface - * @interface: the interface of interest - * @id: array of usb_device_id structures, terminated by zero entry - * - * usb_match_id searches an array of usb_device_id's and returns - * the first one matching the device or interface, or null. - * This is used when binding (or rebinding) a driver to an interface. - * Most USB device drivers will use this indirectly, through the usb core, - * but some layered driver frameworks use it directly. - * These device tables are exported with MODULE_DEVICE_TABLE, through - * modutils and "modules.usbmap", to support the driver loading - * functionality of USB hotplugging. - * - * What Matches: - * - * The "match_flags" element in a usb_device_id controls which - * members are used. If the corresponding bit is set, the - * value in the device_id must match its corresponding member - * in the device or interface descriptor, or else the device_id - * does not match. - * - * "driver_info" is normally used only by device drivers, - * but you can create a wildcard "matches anything" usb_device_id - * as a driver's "modules.usbmap" entry if you provide an id with - * only a nonzero "driver_info" field. If you do this, the USB device - * driver's probe() routine should use additional intelligence to - * decide whether to bind to the specified interface. - * - * What Makes Good usb_device_id Tables: - * - * The match algorithm is very simple, so that intelligence in - * driver selection must come from smart driver id records. - * Unless you have good reasons to use another selection policy, - * provide match elements only in related groups, and order match - * specifiers from specific to general. Use the macros provided - * for that purpose if you can. - * - * The most specific match specifiers use device descriptor - * data. These are commonly used with product-specific matches; - * the USB_DEVICE macro lets you provide vendor and product IDs, - * and you can also match against ranges of product revisions. - * These are widely used for devices with application or vendor - * specific bDeviceClass values. - * - * Matches based on device class/subclass/protocol specifications - * are slightly more general; use the USB_DEVICE_INFO macro, or - * its siblings. These are used with single-function devices - * where bDeviceClass doesn't specify that each interface has - * its own class. - * - * Matches based on interface class/subclass/protocol are the - * most general; they let drivers bind to any interface on a - * multiple-function device. Use the USB_INTERFACE_INFO - * macro, or its siblings, to match class-per-interface style - * devices (as recorded in bDeviceClass). - * - * Within those groups, remember that not all combinations are - * meaningful. For example, don't give a product version range - * without vendor and product IDs; or specify a protocol without - * its associated class and subclass. - */ -const struct usb_device_id * -usb_match_id(struct usb_interface *interface, const struct usb_device_id *id) -{ - struct usb_host_interface *intf; - struct usb_device *dev; - - /* proc_connectinfo in devio.c may call us with id == NULL. */ - if (id == NULL) - return NULL; - - intf = &interface->altsetting [interface->act_altsetting]; - dev = interface_to_usbdev(interface); - - /* It is important to check that id->driver_info is nonzero, - since an entry that is all zeroes except for a nonzero - id->driver_info is the way to create an entry that - indicates that the driver want to examine every - device and interface. */ - for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass || - id->driver_info; id++) { - - if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && - id->idVendor != dev->descriptor.idVendor) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && - id->idProduct != dev->descriptor.idProduct) - continue; - - /* No need to test id->bcdDevice_lo != 0, since 0 is never - greater than any unsigned number. */ - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && - (id->bcdDevice_lo > dev->descriptor.bcdDevice)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && - (id->bcdDevice_hi < dev->descriptor.bcdDevice)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && - (id->bDeviceClass != dev->descriptor.bDeviceClass)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && - (id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && - (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && - (id->bInterfaceClass != intf->desc.bInterfaceClass)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && - (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass)) - continue; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && - (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol)) - continue; - - return id; - } - - return NULL; -} - -/** - * usb_find_interface - find usb_interface pointer for driver and device - * @drv: the driver whose current configuration is considered - * @minor: the minor number of the desired device - * - * This walks the driver device list and returns a pointer to the interface - * with the matching minor. Note, this only works for devices that share the - * USB major number. - */ -struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor) -{ - struct list_head *entry; - struct device *dev; - struct usb_interface *intf; - - list_for_each(entry, &drv->driver.devices) { - dev = container_of(entry, struct device, driver_list); - - /* can't look at usb devices, only interfaces */ - if (dev->driver == &usb_generic_driver) - continue; - - intf = to_usb_interface(dev); - if (intf->minor == -1) - continue; - if (intf->minor == minor) - return intf; - } - - /* no device found that matches */ - return NULL; -} - -static int usb_device_match (struct device *dev, struct device_driver *drv) -{ - struct usb_interface *intf; - struct usb_driver *usb_drv; - const struct usb_device_id *id; - - /* check for generic driver, which we don't match any device with */ - if (drv == &usb_generic_driver) - return 0; - - intf = to_usb_interface(dev); - - usb_drv = to_usb_driver(drv); - id = usb_drv->id_table; - - id = usb_match_id (intf, usb_drv->id_table); - if (id) - return 1; - - return 0; -} - - -#ifdef CONFIG_HOTPLUG - -/* - * USB hotplugging invokes what /proc/sys/kernel/hotplug says - * (normally /sbin/hotplug) when USB devices get added or removed. - * - * This invokes a user mode policy agent, typically helping to load driver - * or other modules, configure the device, and more. Drivers can provide - * a MODULE_DEVICE_TABLE to help with module loading subtasks. - * - * We're called either from khubd (the typical case) or from root hub - * (init, kapmd, modprobe, rmmod, etc), but the agents need to handle - * delays in event delivery. Use sysfs (and DEVPATH) to make sure the - * device (and this configuration!) are still present. - */ -static int usb_hotplug (struct device *dev, char **envp, int num_envp, - char *buffer, int buffer_size) -{ - struct usb_interface *intf; - struct usb_device *usb_dev; - char *scratch; - int i = 0; - int length = 0; - - dbg ("%s", __FUNCTION__); - - if (!dev) - return -ENODEV; - - /* Must check driver_data here, as on remove driver is always NULL */ - if ((dev->driver == &usb_generic_driver) || - (dev->driver_data == &usb_generic_driver_data)) - return 0; - - intf = to_usb_interface(dev); - usb_dev = interface_to_usbdev (intf); - - if (usb_dev->devnum < 0) { - dbg ("device already deleted ??"); - return -ENODEV; - } - if (!usb_dev->bus) { - dbg ("bus already removed?"); - return -ENODEV; - } - - scratch = buffer; - -#ifdef CONFIG_USB_DEVICEFS - /* If this is available, userspace programs can directly read - * all the device descriptors we don't tell them about. Or - * even act as usermode drivers. - * - * FIXME reduce hardwired intelligence here - */ - envp [i++] = scratch; - length += snprintf (scratch, buffer_size - length, - "DEVICE=/proc/bus/usb/%03d/%03d", - usb_dev->bus->busnum, usb_dev->devnum); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; - ++length; - scratch += length; -#endif - - /* per-device configurations are common */ - envp [i++] = scratch; - length += snprintf (scratch, buffer_size - length, "PRODUCT=%x/%x/%x", - usb_dev->descriptor.idVendor, - usb_dev->descriptor.idProduct, - usb_dev->descriptor.bcdDevice); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; - ++length; - scratch += length; - - /* class-based driver binding models */ - envp [i++] = scratch; - length += snprintf (scratch, buffer_size - length, "TYPE=%d/%d/%d", - usb_dev->descriptor.bDeviceClass, - usb_dev->descriptor.bDeviceSubClass, - usb_dev->descriptor.bDeviceProtocol); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; - ++length; - scratch += length; - - if (usb_dev->descriptor.bDeviceClass == 0) { - int alt = intf->act_altsetting; - - /* 2.4 only exposed interface zero. in 2.5, hotplug - * agents are called for all interfaces, and can use - * $DEVPATH/bInterfaceNumber if necessary. - */ - envp [i++] = scratch; - length += snprintf (scratch, buffer_size - length, - "INTERFACE=%d/%d/%d", - intf->altsetting[alt].desc.bInterfaceClass, - intf->altsetting[alt].desc.bInterfaceSubClass, - intf->altsetting[alt].desc.bInterfaceProtocol); - if ((buffer_size - length <= 0) || (i >= num_envp)) - return -ENOMEM; - ++length; - scratch += length; - - } - envp [i++] = 0; - - return 0; -} - -#else - -static int usb_hotplug (struct device *dev, char **envp, - int num_envp, char *buffer, int buffer_size) -{ - return -ENODEV; -} - -#endif /* CONFIG_HOTPLUG */ - -/** - * usb_alloc_dev - allocate a usb device structure (usbcore-internal) - * @parent: hub to which device is connected - * @bus: bus used to access the device - * Context: !in_interrupt () - * - * Only hub drivers (including virtual root hub drivers for host - * controllers) should ever call this. - * - * This call is synchronous, and may not be used in an interrupt context. - */ -struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus) -{ - struct usb_device *dev; - - dev = kmalloc(sizeof(*dev), GFP_KERNEL); - if (!dev) - return NULL; - - memset(dev, 0, sizeof(*dev)); - - device_initialize(&dev->dev); - dev->state = USB_STATE_ATTACHED; - - usb_bus_get(bus); - - if (!parent) - dev->devpath [0] = '0'; - dev->bus = bus; - dev->parent = parent; - INIT_LIST_HEAD(&dev->filelist); - - init_MUTEX(&dev->serialize); - - if (dev->bus->op->allocate) - dev->bus->op->allocate(dev); - - return dev; -} - -/** - * usb_get_dev - increments the reference count of the usb device structure - * @dev: the device being referenced - * - * Each live reference to a device should be refcounted. - * - * Drivers for USB interfaces should normally record such references in - * their probe() methods, when they bind to an interface, and release - * them by calling usb_put_dev(), in their disconnect() methods. - * - * A pointer to the device with the incremented reference counter is returned. - */ -struct usb_device *usb_get_dev (struct usb_device *dev) -{ - struct device *tmp; - - if (!dev) - return NULL; - - tmp = get_device(&dev->dev); - if (tmp) - return to_usb_device(tmp); - else - return NULL; -} - -/** - * usb_put_dev - release a use of the usb device structure - * @dev: device that's been disconnected - * - * Must be called when a user of a device is finished with it. When the last - * user of the device calls this function, the memory of the device is freed. - */ -void usb_put_dev(struct usb_device *dev) -{ - if (dev) - put_device(&dev->dev); -} - -/** - * usb_release_dev - free a usb device structure when all users of it are finished. - * @dev: device that's been disconnected - * - * Will be called only by the device core when all users of this usb device are - * done. - */ -static void usb_release_dev(struct device *dev) -{ - struct usb_device *udev; - - udev = to_usb_device(dev); - - if (udev->bus && udev->bus->op && udev->bus->op->deallocate) - udev->bus->op->deallocate(udev); - usb_destroy_configuration (udev); - usb_bus_put (udev->bus); - kfree (udev); -} - - -static struct usb_device *match_device(struct usb_device *dev, - u16 vendor_id, u16 product_id) -{ - struct usb_device *ret_dev = NULL; - int child; - - dbg("looking at vendor %d, product %d", - dev->descriptor.idVendor, - dev->descriptor.idProduct); - - /* see if this device matches */ - if ((dev->descriptor.idVendor == vendor_id) && - (dev->descriptor.idProduct == product_id)) { - dbg ("found the device!"); - ret_dev = usb_get_dev(dev); - goto exit; - } - - /* look through all of the children of this device */ - for (child = 0; child < dev->maxchild; ++child) { - if (dev->children[child]) { - ret_dev = match_device(dev->children[child], - vendor_id, product_id); - if (ret_dev) - goto exit; - } - } -exit: - return ret_dev; -} - -/** - * usb_find_device - find a specific usb device in the system - * @vendor_id: the vendor id of the device to find - * @product_id: the product id of the device to find - * - * Returns a pointer to a struct usb_device if such a specified usb - * device is present in the system currently. The usage count of the - * device will be incremented if a device is found. Make sure to call - * usb_put_dev() when the caller is finished with the device. - * - * If a device with the specified vendor and product id is not found, - * NULL is returned. - */ -struct usb_device *usb_find_device(u16 vendor_id, u16 product_id) -{ - struct list_head *buslist; - struct usb_bus *bus; - struct usb_device *dev = NULL; - - down(&usb_bus_list_lock); - for (buslist = usb_bus_list.next; - buslist != &usb_bus_list; - buslist = buslist->next) { - bus = container_of(buslist, struct usb_bus, bus_list); - dev = match_device(bus->root_hub, vendor_id, product_id); - if (dev) - goto exit; - } -exit: - up(&usb_bus_list_lock); - return dev; -} - -/** - * usb_get_current_frame_number - return current bus frame number - * @dev: the device whose bus is being queried - * - * Returns the current frame number for the USB host controller - * used with the given USB device. This can be used when scheduling - * isochronous requests. - * - * Note that different kinds of host controller have different - * "scheduling horizons". While one type might support scheduling only - * 32 frames into the future, others could support scheduling up to - * 1024 frames into the future. - */ -int usb_get_current_frame_number(struct usb_device *dev) -{ - return dev->bus->op->get_frame_number (dev); -} - -/*-------------------------------------------------------------------*/ -/* - * __usb_get_extra_descriptor() finds a descriptor of specific type in the - * extra field of the interface and endpoint descriptor structs. - */ - -int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr) -{ - struct usb_descriptor_header *header; - - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if (header->bLength < 2) { - err("invalid descriptor length of %d", header->bLength); - return -1; - } - - if (header->bDescriptorType == type) { - *ptr = header; - return 0; - } - - buffer += header->bLength; - size -= header->bLength; - } - return -1; -} - -/** - * usb_disconnect - disconnect a device (usbcore-internal) - * @pdev: pointer to device being disconnected - * Context: !in_interrupt () - * - * Something got disconnected. Get rid of it, and all of its children. - * - * Only hub drivers (including virtual root hub drivers for host - * controllers) should ever call this. - * - * This call is synchronous, and may not be used in an interrupt context. - */ -void usb_disconnect(struct usb_device **pdev) -{ - struct usb_device *dev = *pdev; - struct usb_bus *bus; - struct usb_operations *ops; - int i; - - might_sleep (); - - if (!dev) { - pr_debug ("%s nodev\n", __FUNCTION__); - return; - } - bus = dev->bus; - if (!bus) { - pr_debug ("%s nobus\n", __FUNCTION__); - return; - } - ops = bus->op; - - *pdev = NULL; - - /* mark the device as inactive, so any further urb submissions for - * this device will fail. - */ - dev->state = USB_STATE_NOTATTACHED; - - dev_info (&dev->dev, "USB disconnect, address %d\n", dev->devnum); - - /* Free up all the children before we remove this device */ - for (i = 0; i < USB_MAXCHILDREN; i++) { - struct usb_device **child = dev->children + i; - if (*child) - usb_disconnect(child); - } - - /* disconnect() drivers from interfaces (a key side effect) */ - dev_dbg (&dev->dev, "unregistering interfaces\n"); - if (dev->actconfig) { - for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { - struct usb_interface *interface; - - /* remove this interface */ - interface = &dev->actconfig->interface[i]; - device_unregister(&interface->dev); - } - } - - /* deallocate hcd/hardware state */ - if (ops->disable) { - void (*disable)(struct usb_device *, int) = ops->disable; - - for (i = 0; i < 15; i++) { - disable (dev, i); - disable (dev, USB_DIR_IN | i); - } - } - - dev_dbg (&dev->dev, "unregistering device\n"); - /* Free the device number and remove the /proc/bus/usb entry */ - if (dev->devnum > 0) { - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - usbfs_remove_device(dev); - } - device_unregister(&dev->dev); - - /* Decrement the reference count, it'll auto free everything when */ - /* it hits 0 which could very well be now */ - usb_put_dev(dev); -} - -/** - * usb_connect - pick device address (usbcore-internal) - * @dev: newly detected device (in DEFAULT state) - * - * Picks a device address. It's up to the hub (or root hub) driver - * to handle and manage enumeration, starting from the DEFAULT state. - * Only hub drivers (including virtual root hub drivers for host - * controllers) should ever call this. - */ -void usb_connect(struct usb_device *dev) -{ - int devnum; - // FIXME needs locking for SMP!! - /* why? this is called only from the hub thread, - * which hopefully doesn't run on multiple CPU's simultaneously 8-) - * ... it's also called from modprobe/rmmod/apmd threads as part - * of virtual root hub init/reinit. In the init case, the hub code - * won't have seen this, but not so for reinit ... - */ - dev->descriptor.bMaxPacketSize0 = 8; /* Start off at 8 bytes */ - - /* Try to allocate the next devnum beginning at bus->devnum_next. */ - devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, dev->bus->devnum_next); - if (devnum >= 128) - devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, 1); - - dev->bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1); - - if (devnum < 128) { - set_bit(devnum, dev->bus->devmap.devicemap); - dev->devnum = devnum; - } -} - - -// hub-only!! ... and only exported for reset/reinit path. -// otherwise used internally, for usb_new_device() -int usb_set_address(struct usb_device *dev) -{ - int retval; - - if (dev->devnum == 0) - return -EINVAL; - if (dev->state != USB_STATE_DEFAULT && dev->state != USB_STATE_ADDRESS) - return -EINVAL; - retval = usb_control_msg(dev, usb_snddefctrl(dev), USB_REQ_SET_ADDRESS, - 0, dev->devnum, 0, NULL, 0, HZ * USB_CTRL_SET_TIMEOUT); - if (retval == 0) - dev->state = USB_STATE_ADDRESS; - return retval; -} - - -/* improve on the default device description, if we can ... and - * while we're at it, maybe show the vendor and product strings. - */ -static void set_device_description (struct usb_device *dev) -{ - void *buf; - int mfgr = dev->descriptor.iManufacturer; - int prod = dev->descriptor.iProduct; - int vendor_id = dev->descriptor.idVendor; - int product_id = dev->descriptor.idProduct; - char *mfgr_str, *prod_str; - - /* set default; keep it if there are no strings, or kmalloc fails */ - sprintf (dev->dev.name, "USB device %04x:%04x", - vendor_id, product_id); - - if (!(buf = kmalloc(256 * 2, GFP_KERNEL))) - return; - - prod_str = (char *) buf; - mfgr_str = (char *) buf + 256; - - if (prod && usb_string (dev, prod, prod_str, 256) > 0) { -#ifdef DEBUG - dev_printk (KERN_INFO, &dev->dev, "Product: %s\n", prod_str); -#endif - } else { - prod_str = 0; - } - - if (mfgr && usb_string (dev, mfgr, mfgr_str, 256) > 0) { -#ifdef DEBUG - dev_printk (KERN_INFO, &dev->dev, "Manufacturer: %s\n", mfgr_str); -#endif - } else { - mfgr_str = 0; - } - - /* much like pci ... describe as either: - * - both strings: 'product descr (vendor descr)' - * - product only: 'product descr (USB device vvvv:pppp)' - * - vendor only: 'USB device vvvv:pppp (vendor descr)' - * - neither string: 'USB device vvvv:pppp' - */ - - if (prod_str && mfgr_str) { - - snprintf(dev->dev.name, sizeof dev->dev.name, - "%s (%s)", prod_str, mfgr_str); - } else if (prod_str) { - snprintf(dev->dev.name, sizeof dev->dev.name, - "%s (USB device %04x:%04x)", - prod_str, vendor_id, product_id); - - } else if (mfgr_str) { - snprintf(dev->dev.name, sizeof dev->dev.name, - "USB device %04x:%04x (%s)", - vendor_id, product_id, mfgr_str); - } - //usbprintk("USB connected: %s\n",dev->dev.name); - kfree(buf); -} - -/* - * By the time we get here, we chose a new device address - * and is in the default state. We need to identify the thing and - * get the ball rolling.. - * - * Returns 0 for success, != 0 for error. - * - * This call is synchronous, and may not be used in an interrupt context. - * - * Only hub drivers (including virtual root hub drivers for host - * controllers) should ever call this. - */ -#define NEW_DEVICE_RETRYS 2 -#define SET_ADDRESS_RETRYS 2 -int usb_new_device(struct usb_device *dev, struct device *parent) -{ - int err = 0; - int i; - int j; - - /* - * Set the driver for the usb device to point to the "generic" driver. - * This prevents the main usb device from being sent to the usb bus - * probe function. Yes, it's a hack, but a nice one :) - * - * Do it asap, so more driver model stuff (like the device.h message - * utilities) can be used in hcd submit/unlink code paths. - */ - usb_generic_driver.bus = &usb_bus_type; - dev->dev.parent = parent; - dev->dev.driver = &usb_generic_driver; - dev->dev.bus = &usb_bus_type; - dev->dev.release = usb_release_dev; - dev->dev.driver_data = &usb_generic_driver_data; - usb_get_dev(dev); - if (dev->dev.bus_id[0] == 0) - sprintf (&dev->dev.bus_id[0], "%d-%s", - dev->bus->busnum, dev->devpath); - - /* dma masks come from the controller; readonly, except to hcd */ - dev->dev.dma_mask = parent->dma_mask; - - /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ... - * it's fixed size except for full speed devices. - */ - switch (dev->speed) { - case USB_SPEED_HIGH: /* fixed at 64 */ - i = 64; - break; - case USB_SPEED_FULL: /* 8, 16, 32, or 64 */ - /* to determine the ep0 maxpacket size, read the first 8 - * bytes from the device descriptor to get bMaxPacketSize0; - * then correct our initial (small) guess. - */ - // FALLTHROUGH - case USB_SPEED_LOW: /* fixed at 8 */ - i = 8; - break; - default: - return -EINVAL; - } - dev->epmaxpacketin [0] = i; - dev->epmaxpacketout[0] = i; - - for (i = 0; i < NEW_DEVICE_RETRYS; ++i) { - - for (j = 0; j < SET_ADDRESS_RETRYS; ++j) { - err = usb_set_address(dev); - if (err >= 0) - break; - wait_ms(200); - } - if (err < 0) { - dev_err(&dev->dev, "USB device not accepting new address=%d (error=%d)\n", - dev->devnum, err); - dev->state = USB_STATE_DEFAULT; - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - - wait_ms(10); /* Let the SET_ADDRESS settle */ - - /* high and low speed devices don't need this... */ - err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8); - if (err >= 8) - break; - wait_ms(100); - } - - if (err < 8) { - if (err < 0) - dev_err(&dev->dev, "USB device not responding, giving up (error=%d)\n", err); - else - dev_err(&dev->dev, "USB device descriptor short read (expected %i, got %i)\n", 8, err); - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - if (dev->speed == USB_SPEED_FULL) { - dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0; - dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0; - } - - /* USB device state == addressed ... still not usable */ - - err = usb_get_device_descriptor(dev); - if (err < (signed)sizeof(dev->descriptor)) { - if (err < 0) - dev_err(&dev->dev, "unable to get device descriptor (error=%d)\n", err); - else - dev_err(&dev->dev, "USB device descriptor short read (expected %Zi, got %i)\n", - sizeof(dev->descriptor), err); - - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - - err = usb_get_configuration(dev); - if (err < 0) { - dev_err(&dev->dev, "unable to get device %d configuration (error=%d)\n", - dev->devnum, err); - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - - /* we set the default configuration here */ - err = usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue); - if (err) { - dev_err(&dev->dev, "failed to set device %d default configuration (error=%d)\n", - dev->devnum, err); - clear_bit(dev->devnum, dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } - - /* USB device state == configured ... tell the world! */ - - dev_dbg(&dev->dev, "new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n", - dev->descriptor.iManufacturer, dev->descriptor.iProduct, dev->descriptor.iSerialNumber); - set_device_description (dev); - -#ifdef DEBUG - if (dev->descriptor.iSerialNumber) - usb_show_string(dev, "SerialNumber", dev->descriptor.iSerialNumber); -#endif - /* put into sysfs, with device and config specific files */ - err = device_add (&dev->dev); - if (err) - return err; - usb_create_driverfs_dev_files (dev); - - /* Register all of the interfaces for this device with the driver core. - * Remember, interfaces get bound to drivers, not devices. */ - for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { - struct usb_interface *interface = &dev->actconfig->interface[i]; - struct usb_interface_descriptor *desc; - - desc = &interface->altsetting [interface->act_altsetting].desc; - interface->dev.parent = &dev->dev; - interface->dev.driver = NULL; - interface->dev.bus = &usb_bus_type; - interface->dev.dma_mask = parent->dma_mask; - sprintf (&interface->dev.bus_id[0], "%d-%s:%d", - dev->bus->busnum, dev->devpath, - desc->bInterfaceNumber); - if (!desc->iInterface - || usb_string (dev, desc->iInterface, - interface->dev.name, - sizeof interface->dev.name) <= 0) { - /* typically devices won't bother with interface - * descriptions; this is the normal case. an - * interface's driver might describe it better. - * (also: iInterface is per-altsetting ...) - */ - sprintf (&interface->dev.name[0], - "usb-%s-%s interface %d", - dev->bus->bus_name, dev->devpath, - desc->bInterfaceNumber); - } - dev_dbg (&dev->dev, "%s - registering interface %s\n", __FUNCTION__, interface->dev.bus_id); - device_add (&interface->dev); - usb_create_driverfs_intf_files (interface); - } - /* add a /proc/bus/usb entry */ - usbfs_add_device(dev); - - return 0; -} - -/** - * usb_buffer_alloc - allocate dma-consistent buffer for URB_NO_DMA_MAP - * @dev: device the buffer will be used with - * @size: requested buffer size - * @mem_flags: affect whether allocation may block - * @dma: used to return DMA address of buffer - * - * Return value is either null (indicating no buffer could be allocated), or - * the cpu-space pointer to a buffer that may be used to perform DMA to the - * specified device. Such cpu-space buffers are returned along with the DMA - * address (through the pointer provided). - * - * These buffers are used with URB_NO_DMA_MAP set in urb->transfer_flags to - * avoid behaviors like using "DMA bounce buffers", or tying down I/O mapping - * hardware for long idle periods. The implementation varies between - * platforms, depending on details of how DMA will work to this device. - * Using these buffers also helps prevent cacheline sharing problems on - * architectures where CPU caches are not DMA-coherent. - * - * When the buffer is no longer used, free it with usb_buffer_free(). - */ -void *usb_buffer_alloc ( - struct usb_device *dev, - size_t size, - int mem_flags, - dma_addr_t *dma -) -{ - if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->buffer_alloc) - return 0; - return dev->bus->op->buffer_alloc (dev->bus, size, mem_flags, dma); -} - -/** - * usb_buffer_free - free memory allocated with usb_buffer_alloc() - * @dev: device the buffer was used with - * @size: requested buffer size - * @addr: CPU address of buffer - * @dma: DMA address of buffer - * - * This reclaims an I/O buffer, letting it be reused. The memory must have - * been allocated using usb_buffer_alloc(), and the parameters must match - * those provided in that allocation request. - */ -void usb_buffer_free ( - struct usb_device *dev, - size_t size, - void *addr, - dma_addr_t dma -) -{ - if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->buffer_free) - return; - dev->bus->op->buffer_free (dev->bus, size, addr, dma); -} - -/** - * usb_buffer_map - create DMA mapping(s) for an urb - * @urb: urb whose transfer_buffer will be mapped - * - * Return value is either null (indicating no buffer could be mapped), or - * the parameter. URB_NO_DMA_MAP is added to urb->transfer_flags if the - * operation succeeds. If the device is connected to this system through - * a non-DMA controller, this operation always succeeds. - * - * This call would normally be used for an urb which is reused, perhaps - * as the target of a large periodic transfer, with usb_buffer_dmasync() - * calls to synchronize memory and dma state. It may not be used for - * control requests. - * - * Reverse the effect of this call with usb_buffer_unmap(). - */ -struct urb *usb_buffer_map (struct urb *urb) -{ - struct usb_bus *bus; - struct device *controller; - - if (!urb - || usb_pipecontrol (urb->pipe) - || !urb->dev - || !(bus = urb->dev->bus) - || !(controller = bus->controller)) - return 0; - - if (controller->dma_mask) { - urb->transfer_dma = dma_map_single (controller, - urb->transfer_buffer, urb->transfer_buffer_length, - usb_pipein (urb->pipe) - ? DMA_FROM_DEVICE : DMA_TO_DEVICE); - // FIXME generic api broken like pci, can't report errors - // if (urb->transfer_dma == DMA_ADDR_INVALID) return 0; - } else - urb->transfer_dma = ~0; - urb->transfer_flags |= URB_NO_DMA_MAP; - return urb; -} - -/** - * usb_buffer_dmasync - synchronize DMA and CPU view of buffer(s) - * @urb: urb whose transfer_buffer will be synchronized - */ -void usb_buffer_dmasync (struct urb *urb) -{ - struct usb_bus *bus; - struct device *controller; - - if (!urb - || !(urb->transfer_flags & URB_NO_DMA_MAP) - || !urb->dev - || !(bus = urb->dev->bus) - || !(controller = bus->controller)) - return; - - if (controller->dma_mask) - dma_sync_single (controller, - urb->transfer_dma, urb->transfer_buffer_length, - usb_pipein (urb->pipe) - ? DMA_FROM_DEVICE : DMA_TO_DEVICE); -} - -/** - * usb_buffer_unmap - free DMA mapping(s) for an urb - * @urb: urb whose transfer_buffer will be unmapped - * - * Reverses the effect of usb_buffer_map(). - */ -void usb_buffer_unmap (struct urb *urb) -{ - struct usb_bus *bus; - struct device *controller; - - if (!urb - || !(urb->transfer_flags & URB_NO_DMA_MAP) - || !urb->dev - || !(bus = urb->dev->bus) - || !(controller = bus->controller)) - return; - - if (controller->dma_mask) - dma_unmap_single (controller, - urb->transfer_dma, urb->transfer_buffer_length, - usb_pipein (urb->pipe) - ? DMA_FROM_DEVICE : DMA_TO_DEVICE); - urb->transfer_flags &= ~URB_NO_DMA_MAP; -} - -/** - * usb_buffer_map_sg - create scatterlist DMA mapping(s) for an endpoint - * @dev: device to which the scatterlist will be mapped - * @pipe: endpoint defining the mapping direction - * @sg: the scatterlist to map - * @nents: the number of entries in the scatterlist - * - * Return value is either < 0 (indicating no buffers could be mapped), or - * the number of DMA mapping array entries in the scatterlist. - * - * The caller is responsible for placing the resulting DMA addresses from - * the scatterlist into URB transfer buffer pointers, and for setting the - * URB_NO_DMA_MAP transfer flag in each of those URBs. - * - * Top I/O rates come from queuing URBs, instead of waiting for each one - * to complete before starting the next I/O. This is particularly easy - * to do with scatterlists. Just allocate and submit one URB for each DMA - * mapping entry returned, stopping on the first error or when all succeed. - * Better yet, use the usb_sg_*() calls, which do that (and more) for you. - * - * This call would normally be used when translating scatterlist requests, - * rather than usb_buffer_map(), since on some hardware (with IOMMUs) it - * may be able to coalesce mappings for improved I/O efficiency. - * - * Reverse the effect of this call with usb_buffer_unmap_sg(). - */ -int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int nents) -{ - struct usb_bus *bus; - struct device *controller; - - if (!dev - || usb_pipecontrol (pipe) - || !(bus = dev->bus) - || !(controller = bus->controller) - || !controller->dma_mask) - return -1; - - // FIXME generic api broken like pci, can't report errors - return dma_map_sg (controller, sg, nents, - usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); -} - -/** - * usb_buffer_dmasync_sg - synchronize DMA and CPU view of scatterlist buffer(s) - * @dev: device to which the scatterlist will be mapped - * @pipe: endpoint defining the mapping direction - * @sg: the scatterlist to synchronize - * @n_hw_ents: the positive return value from usb_buffer_map_sg - * - * Use this when you are re-using a scatterlist's data buffers for - * another USB request. - */ -void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int n_hw_ents) -{ - struct usb_bus *bus; - struct device *controller; - - if (!dev - || !(bus = dev->bus) - || !(controller = bus->controller) - || !controller->dma_mask) - return; - - dma_sync_sg (controller, sg, n_hw_ents, - usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); -} - -/** - * usb_buffer_unmap_sg - free DMA mapping(s) for a scatterlist - * @dev: device to which the scatterlist will be mapped - * @pipe: endpoint defining the mapping direction - * @sg: the scatterlist to unmap - * @n_hw_ents: the positive return value from usb_buffer_map_sg - * - * Reverses the effect of usb_buffer_map_sg(). - */ -void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int n_hw_ents) -{ - struct usb_bus *bus; - struct device *controller; - - if (!dev - || !(bus = dev->bus) - || !(controller = bus->controller) - || !controller->dma_mask) - return; - - dma_unmap_sg (controller, sg, n_hw_ents, - usb_pipein (pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); -} - - -struct bus_type usb_bus_type = { - .name = "usb", - .match = usb_device_match, - .hotplug = usb_hotplug, -}; - -#ifndef MODULE - -static int __init usb_setup_disable(char *str) -{ - nousb = 1; - return 1; -} - -/* format to disable USB on kernel command line is: nousb */ -__setup("nousb", usb_setup_disable); - -#endif - -/* - * for external read access to - */ -int usb_disabled(void) -{ - return nousb; -} - -/* - * Init - */ -static int __init usb_init(void) -{ - if (nousb) { - info("USB support disabled\n"); - return 0; - } - - bus_register(&usb_bus_type); - usb_major_init(); - usbfs_init(); - usb_hub_init(); - - driver_register(&usb_generic_driver); - - return 0; -} - -/* - * Cleanup - */ -static void __exit usb_exit(void) -{ - /* This will matter if shutdown/reboot does exitcalls. */ - if (nousb) - return; - - driver_unregister(&usb_generic_driver); - usb_major_cleanup(); - usbfs_cleanup(); - usb_hub_cleanup(); - bus_unregister(&usb_bus_type); -} - -subsys_initcall(usb_init); -module_exit(usb_exit); - -/* - * USB may be built into the kernel or be built as modules. - * These symbols are exported for device (or host controller) - * driver modules to use. - */ -EXPORT_SYMBOL(usb_epnum_to_ep_desc); - -EXPORT_SYMBOL(usb_register); -EXPORT_SYMBOL(usb_deregister); -EXPORT_SYMBOL(usb_disabled); - -EXPORT_SYMBOL(usb_device_probe); -EXPORT_SYMBOL(usb_device_remove); - -EXPORT_SYMBOL(usb_alloc_dev); -EXPORT_SYMBOL(usb_put_dev); -EXPORT_SYMBOL(usb_get_dev); -EXPORT_SYMBOL(usb_hub_tt_clear_buffer); - -EXPORT_SYMBOL(usb_driver_claim_interface); -EXPORT_SYMBOL(usb_interface_claimed); -EXPORT_SYMBOL(usb_driver_release_interface); -EXPORT_SYMBOL(usb_match_id); -EXPORT_SYMBOL(usb_find_interface); -EXPORT_SYMBOL(usb_ifnum_to_if); - -EXPORT_SYMBOL(usb_new_device); -EXPORT_SYMBOL(usb_reset_device); -EXPORT_SYMBOL(usb_connect); -EXPORT_SYMBOL(usb_disconnect); - -EXPORT_SYMBOL(__usb_get_extra_descriptor); - -EXPORT_SYMBOL(usb_find_device); -EXPORT_SYMBOL(usb_get_current_frame_number); - -EXPORT_SYMBOL (usb_buffer_alloc); -EXPORT_SYMBOL (usb_buffer_free); - -EXPORT_SYMBOL (usb_buffer_map); -EXPORT_SYMBOL (usb_buffer_dmasync); -EXPORT_SYMBOL (usb_buffer_unmap); - -EXPORT_SYMBOL (usb_buffer_map_sg); -EXPORT_SYMBOL (usb_buffer_dmasync_sg); -EXPORT_SYMBOL (usb_buffer_unmap_sg); - -MODULE_LICENSE("GPL"); diff --git a/lib/usb/core/usb.h b/lib/usb/core/usb.h deleted file mode 100644 index 09f459f67..000000000 --- a/lib/usb/core/usb.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Functions local to drivers/usb/core/ */ - -extern void usb_create_driverfs_dev_files (struct usb_device *dev); -extern void usb_create_driverfs_intf_files (struct usb_interface *intf); - diff --git a/lib/usb/host/ohci-dbg.c b/lib/usb/host/ohci-dbg.c deleted file mode 100644 index 0997ddfa2..000000000 --- a/lib/usb/host/ohci-dbg.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * This file is licenced under the GPL. - */ - -/*-------------------------------------------------------------------------*/ - -#ifdef DEBUG - -#define edstring(ed_type) ({ char *temp; \ - switch (ed_type) { \ - case PIPE_CONTROL: temp = "ctrl"; break; \ - case PIPE_BULK: temp = "bulk"; break; \ - case PIPE_INTERRUPT: temp = "intr"; break; \ - default: temp = "isoc"; break; \ - }; temp;}) -#define pipestring(pipe) edstring(usb_pipetype(pipe)) - -/* debug| print the main components of an URB - * small: 0) header + data packets 1) just header - */ -static void __attribute__((unused)) -urb_print (struct urb * urb, char * str, int small) -{ - unsigned int pipe= urb->pipe; - - if (!urb->dev || !urb->dev->bus) { - dbg("%s URB: no dev", str); - return; - } - -#ifndef OHCI_VERBOSE_DEBUG - if (urb->status != 0) -#endif - dbg("%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d stat=%d", - str, - urb, - usb_pipedevice (pipe), - usb_pipeendpoint (pipe), - usb_pipeout (pipe)? "out" : "in", - pipestring (pipe), - urb->transfer_flags, - urb->actual_length, - urb->transfer_buffer_length, - urb->status); - -#ifdef OHCI_VERBOSE_DEBUG - if (!small) { - int i, len; - - if (usb_pipecontrol (pipe)) { - printk (KERN_DEBUG __FILE__ ": setup(8):"); - for (i = 0; i < 8 ; i++) - printk (" %02x", ((__u8 *) urb->setup_packet) [i]); - printk ("\n"); - } - if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) { - printk (KERN_DEBUG __FILE__ ": data(%d/%d):", - urb->actual_length, - urb->transfer_buffer_length); - len = usb_pipeout (pipe)? - urb->transfer_buffer_length: urb->actual_length; - for (i = 0; i < 16 && i < len; i++) - printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]); - printk ("%s stat:%d\n", i < len? "...": "", urb->status); - } - } -#endif -} - -#define ohci_dbg_sw(ohci, next, size, format, arg...) \ - do { \ - if (next) { \ - unsigned s_len; \ - s_len = snprintf (*next, *size, format, ## arg ); \ - *size -= s_len; *next += s_len; \ - } else \ - ohci_dbg(ohci,format, ## arg ); \ - } while (0); - - -static void ohci_dump_intr_mask ( - struct ohci_hcd *ohci, - char *label, - u32 mask, - char **next, - unsigned *size) -{ - ohci_dbg_sw (ohci, next, size, "%s 0x%08x%s%s%s%s%s%s%s%s%s\n", - label, - mask, - (mask & OHCI_INTR_MIE) ? " MIE" : "", - (mask & OHCI_INTR_OC) ? " OC" : "", - (mask & OHCI_INTR_RHSC) ? " RHSC" : "", - (mask & OHCI_INTR_FNO) ? " FNO" : "", - (mask & OHCI_INTR_UE) ? " UE" : "", - (mask & OHCI_INTR_RD) ? " RD" : "", - (mask & OHCI_INTR_SF) ? " SF" : "", - (mask & OHCI_INTR_WDH) ? " WDH" : "", - (mask & OHCI_INTR_SO) ? " SO" : "" - ); -} - -static void maybe_print_eds ( - struct ohci_hcd *ohci, - char *label, - u32 value, - char **next, - unsigned *size) -{ - if (value) - ohci_dbg_sw (ohci, next, size, "%s %08x\n", label, value); -} - -static char *hcfs2string (int state) -{ - switch (state) { - case OHCI_USB_RESET: return "reset"; - case OHCI_USB_RESUME: return "resume"; - case OHCI_USB_OPER: return "operational"; - case OHCI_USB_SUSPEND: return "suspend"; - } - return "?"; -} - -// dump control and status registers -static void -ohci_dump_status (struct ohci_hcd *controller, char **next, unsigned *size) -{ - struct ohci_regs *regs = controller->regs; - u32 temp; - - temp = readl (®s->revision) & 0xff; - ohci_dbg_sw (controller, next, size, - "OHCI %d.%d, %s legacy support registers\n", - 0x03 & (temp >> 4), (temp & 0x0f), - (temp & 0x10) ? "with" : "NO"); - - temp = readl (®s->control); - ohci_dbg_sw (controller, next, size, - "control 0x%03x%s%s%s HCFS=%s%s%s%s%s CBSR=%d\n", - temp, - (temp & OHCI_CTRL_RWE) ? " RWE" : "", - (temp & OHCI_CTRL_RWC) ? " RWC" : "", - (temp & OHCI_CTRL_IR) ? " IR" : "", - hcfs2string (temp & OHCI_CTRL_HCFS), - (temp & OHCI_CTRL_BLE) ? " BLE" : "", - (temp & OHCI_CTRL_CLE) ? " CLE" : "", - (temp & OHCI_CTRL_IE) ? " IE" : "", - (temp & OHCI_CTRL_PLE) ? " PLE" : "", - temp & OHCI_CTRL_CBSR - ); - - temp = readl (®s->cmdstatus); - ohci_dbg_sw (controller, next, size, - "cmdstatus 0x%05x SOC=%d%s%s%s%s\n", temp, - (temp & OHCI_SOC) >> 16, - (temp & OHCI_OCR) ? " OCR" : "", - (temp & OHCI_BLF) ? " BLF" : "", - (temp & OHCI_CLF) ? " CLF" : "", - (temp & OHCI_HCR) ? " HCR" : "" - ); - - ohci_dump_intr_mask (controller, "intrstatus", - readl (®s->intrstatus), next, size); - ohci_dump_intr_mask (controller, "intrenable", - readl (®s->intrenable), next, size); - // intrdisable always same as intrenable - - maybe_print_eds (controller, "ed_periodcurrent", - readl (®s->ed_periodcurrent), next, size); - - maybe_print_eds (controller, "ed_controlhead", - readl (®s->ed_controlhead), next, size); - maybe_print_eds (controller, "ed_controlcurrent", - readl (®s->ed_controlcurrent), next, size); - - maybe_print_eds (controller, "ed_bulkhead", - readl (®s->ed_bulkhead), next, size); - maybe_print_eds (controller, "ed_bulkcurrent", - readl (®s->ed_bulkcurrent), next, size); - - maybe_print_eds (controller, "donehead", - readl (®s->donehead), next, size); -} - -#define dbg_port_sw(hc,num,value,next,size) \ - ohci_dbg_sw (hc, next, size, \ - "roothub.portstatus [%d] " \ - "0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \ - num, temp, \ - (temp & RH_PS_PRSC) ? " PRSC" : "", \ - (temp & RH_PS_OCIC) ? " OCIC" : "", \ - (temp & RH_PS_PSSC) ? " PSSC" : "", \ - (temp & RH_PS_PESC) ? " PESC" : "", \ - (temp & RH_PS_CSC) ? " CSC" : "", \ - \ - (temp & RH_PS_LSDA) ? " LSDA" : "", \ - (temp & RH_PS_PPS) ? " PPS" : "", \ - (temp & RH_PS_PRS) ? " PRS" : "", \ - (temp & RH_PS_POCI) ? " POCI" : "", \ - (temp & RH_PS_PSS) ? " PSS" : "", \ - \ - (temp & RH_PS_PES) ? " PES" : "", \ - (temp & RH_PS_CCS) ? " CCS" : "" \ - ); - - -static void -ohci_dump_roothub ( - struct ohci_hcd *controller, - int verbose, - char **next, - unsigned *size) -{ - u32 temp, ndp, i; - - temp = roothub_a (controller); - if (temp == ~(u32)0) - return; - ndp = (temp & RH_A_NDP); - - if (verbose) { - ohci_dbg_sw (controller, next, size, - "roothub.a %08x POTPGT=%d%s%s%s%s%s NDP=%d\n", temp, - ((temp & RH_A_POTPGT) >> 24) & 0xff, - (temp & RH_A_NOCP) ? " NOCP" : "", - (temp & RH_A_OCPM) ? " OCPM" : "", - (temp & RH_A_DT) ? " DT" : "", - (temp & RH_A_NPS) ? " NPS" : "", - (temp & RH_A_PSM) ? " PSM" : "", - ndp - ); - temp = roothub_b (controller); - ohci_dbg_sw (controller, next, size, - "roothub.b %08x PPCM=%04x DR=%04x\n", - temp, - (temp & RH_B_PPCM) >> 16, - (temp & RH_B_DR) - ); - temp = roothub_status (controller); - ohci_dbg_sw (controller, next, size, - "roothub.status %08x%s%s%s%s%s%s\n", - temp, - (temp & RH_HS_CRWE) ? " CRWE" : "", - (temp & RH_HS_OCIC) ? " OCIC" : "", - (temp & RH_HS_LPSC) ? " LPSC" : "", - (temp & RH_HS_DRWE) ? " DRWE" : "", - (temp & RH_HS_OCI) ? " OCI" : "", - (temp & RH_HS_LPS) ? " LPS" : "" - ); - } - - for (i = 0; i < ndp; i++) { - temp = roothub_portstatus (controller, i); - dbg_port_sw (controller, i, temp, next, size); - } -} - -static void ohci_dump (struct ohci_hcd *controller, int verbose) -{ - ohci_dbg (controller, "OHCI controller state\n"); - - // dumps some of the state we know about - ohci_dump_status (controller, NULL, 0); - if (controller->hcca) - ohci_dbg (controller, - "hcca frame #%04x\n", controller->hcca->frame_no); - ohci_dump_roothub (controller, 1, NULL, 0); -} - -static const char data0 [] = "DATA0"; -static const char data1 [] = "DATA1"; - -static void ohci_dump_td (struct ohci_hcd *ohci, char *label, struct td *td) -{ - u32 tmp = le32_to_cpup (&td->hwINFO); - - ohci_dbg (ohci, "%s td %p%s; urb %p index %d; hw next td %08x", - label, td, - (tmp & TD_DONE) ? " (DONE)" : "", - td->urb, td->index, - le32_to_cpup (&td->hwNextTD)); - if ((tmp & TD_ISO) == 0) { - const char *toggle, *pid; - u32 cbp, be; - - switch (tmp & TD_T) { - case TD_T_DATA0: toggle = data0; break; - case TD_T_DATA1: toggle = data1; break; - case TD_T_TOGGLE: toggle = "(CARRY)"; break; - default: toggle = "(?)"; break; - } - switch (tmp & TD_DP) { - case TD_DP_SETUP: pid = "SETUP"; break; - case TD_DP_IN: pid = "IN"; break; - case TD_DP_OUT: pid = "OUT"; break; - default: pid = "(bad pid)"; break; - } - ohci_dbg (ohci, " info %08x CC=%x %s DI=%d %s %s", tmp, - TD_CC_GET(tmp), /* EC, */ toggle, - (tmp & TD_DI) >> 21, pid, - (tmp & TD_R) ? "R" : ""); - cbp = le32_to_cpup (&td->hwCBP); - be = le32_to_cpup (&td->hwBE); - ohci_dbg (ohci, " cbp %08x be %08x (len %d)", cbp, be, - cbp ? (be + 1 - cbp) : 0); - } else { - unsigned i; - ohci_dbg (ohci, " info %08x CC=%x FC=%d DI=%d SF=%04x", tmp, - TD_CC_GET(tmp), - (tmp >> 24) & 0x07, - (tmp & TD_DI) >> 21, - tmp & 0x0000ffff); - ohci_dbg (ohci, " bp0 %08x be %08x", - le32_to_cpup (&td->hwCBP) & ~0x0fff, - le32_to_cpup (&td->hwBE)); - for (i = 0; i < MAXPSW; i++) { - u16 psw = le16_to_cpup (&td->hwPSW [i]); - int cc = (psw >> 12) & 0x0f; - ohci_dbg (ohci, " psw [%d] = %2x, CC=%x %s=%d", i, - psw, cc, - (cc >= 0x0e) ? "OFFSET" : "SIZE", - psw & 0x0fff); - } - } -} - -/* caller MUST own hcd spinlock if verbose is set! */ -static void __attribute__((unused)) -ohci_dump_ed (struct ohci_hcd *ohci, char *label, struct ed *ed, int verbose) -{ - u32 tmp = ed->hwINFO; - char *type = ""; - - ohci_dbg (ohci, "%s, ed %p state 0x%x type %s; next ed %08x", - label, - ed, ed->state, edstring (ed->type), - le32_to_cpup (&ed->hwNextED)); - switch (tmp & (ED_IN|ED_OUT)) { - case ED_OUT: type = "-OUT"; break; - case ED_IN: type = "-IN"; break; - /* else from TDs ... control */ - } - ohci_dbg (ohci, - " info %08x MAX=%d%s%s%s%s EP=%d%s DEV=%d", le32_to_cpu (tmp), - 0x03ff & (le32_to_cpu (tmp) >> 16), - (tmp & ED_DEQUEUE) ? " DQ" : "", - (tmp & ED_ISO) ? " ISO" : "", - (tmp & ED_SKIP) ? " SKIP" : "", - (tmp & ED_LOWSPEED) ? " LOW" : "", - 0x000f & (le32_to_cpu (tmp) >> 7), - type, - 0x007f & le32_to_cpu (tmp)); - ohci_dbg (ohci, " tds: head %08x %s%s tail %08x%s", - tmp = le32_to_cpup (&ed->hwHeadP), - (ed->hwHeadP & ED_C) ? data1 : data0, - (ed->hwHeadP & ED_H) ? " HALT" : "", - le32_to_cpup (&ed->hwTailP), - verbose ? "" : " (not listing)"); - if (verbose) { - struct list_head *tmp; - - /* use ed->td_list because HC concurrently modifies - * hwNextTD as it accumulates ed_donelist. - */ - list_for_each (tmp, &ed->td_list) { - struct td *td; - td = list_entry (tmp, struct td, td_list); - ohci_dump_td (ohci, " ->", td); - } - } -} - -#else -static inline void ohci_dump (struct ohci_hcd *controller, int verbose) {} - -#undef OHCI_VERBOSE_DEBUG - -#endif /* DEBUG */ - -/*-------------------------------------------------------------------------*/ - -#ifdef STUB_DEBUG_FILES - -static inline void create_debug_files (struct ohci_hcd *bus) { } -static inline void remove_debug_files (struct ohci_hcd *bus) { } - -#else - -static inline struct ohci_hcd *dev_to_ohci (struct device *dev) -{ - struct usb_hcd *hcd = dev_get_drvdata (dev); - - return hcd_to_ohci (hcd); -} - -static ssize_t -show_list (struct ohci_hcd *ohci, char *buf, size_t count, struct ed *ed) -{ - unsigned temp, size = count; - - if (!ed) - return 0; - - /* print first --> last */ - while (ed->ed_prev) - ed = ed->ed_prev; - - /* dump a snapshot of the bulk or control schedule */ - while (ed) { - u32 info = ed->hwINFO; - u32 scratch = cpu_to_le32p (&ed->hwINFO); - struct list_head *entry; - struct td *td; - - temp = snprintf (buf, size, - "ed/%p %cs dev%d ep%d%s max %d %08x%s%s %s", - ed, - (info & ED_LOWSPEED) ? 'l' : 'f', - scratch & 0x7f, - (scratch >> 7) & 0xf, - (info & ED_IN) ? "in" : "out", - 0x03ff & (scratch >> 16), - scratch, - (info & ED_SKIP) ? " s" : "", - (ed->hwHeadP & ED_H) ? " H" : "", - (ed->hwHeadP & ED_C) ? data1 : data0); - size -= temp; - buf += temp; - - list_for_each (entry, &ed->td_list) { - u32 cbp, be; - - td = list_entry (entry, struct td, td_list); - scratch = cpu_to_le32p (&td->hwINFO); - cbp = le32_to_cpup (&td->hwCBP); - be = le32_to_cpup (&td->hwBE); - temp = snprintf (buf, size, - "\n\ttd %p %s %d cc=%x urb %p (%08x)", - td, - ({ char *pid; - switch (scratch & TD_DP) { - case TD_DP_SETUP: pid = "setup"; break; - case TD_DP_IN: pid = "in"; break; - case TD_DP_OUT: pid = "out"; break; - default: pid = "(?)"; break; - } pid;}), - cbp ? (be + 1 - cbp) : 0, - TD_CC_GET (scratch), td->urb, scratch); - size -= temp; - buf += temp; - } - - temp = snprintf (buf, size, "\n"); - size -= temp; - buf += temp; - - ed = ed->ed_next; - } - return count - size; -} - -static ssize_t -show_async (struct device *dev, char *buf) -{ - struct ohci_hcd *ohci; - size_t temp; - unsigned long flags; - - ohci = dev_to_ohci(dev); - - /* display control and bulk lists together, for simplicity */ - spin_lock_irqsave (&ohci->lock, flags); - temp = show_list (ohci, buf, PAGE_SIZE, ohci->ed_controltail); - temp += show_list (ohci, buf + temp, PAGE_SIZE - temp, ohci->ed_bulktail); - spin_unlock_irqrestore (&ohci->lock, flags); - - return temp; -} -static DEVICE_ATTR (async, S_IRUGO, show_async, NULL); - - -#define DBG_SCHED_LIMIT 64 - -static ssize_t -show_periodic (struct device *dev, char *buf) -{ - struct ohci_hcd *ohci; - struct ed **seen, *ed; - unsigned long flags; - unsigned temp, size, seen_count; - char *next; - unsigned i; - - if (!(seen = kmalloc (DBG_SCHED_LIMIT * sizeof *seen, SLAB_ATOMIC))) - return 0; - seen_count = 0; - - ohci = dev_to_ohci(dev); - next = buf; - size = PAGE_SIZE; - - temp = snprintf (next, size, "size = %d\n", NUM_INTS); - size -= temp; - next += temp; - - /* dump a snapshot of the periodic schedule (and load) */ - spin_lock_irqsave (&ohci->lock, flags); - for (i = 0; i < NUM_INTS; i++) { - if (!(ed = ohci->periodic [i])) - continue; - - temp = snprintf (next, size, "%2d [%3d]:", i, ohci->load [i]); - size -= temp; - next += temp; - - do { - temp = snprintf (next, size, " ed%d/%p", - ed->interval, ed); - size -= temp; - next += temp; - for (temp = 0; temp < seen_count; temp++) { - if (seen [temp] == ed) - break; - } - - /* show more info the first time around */ - if (temp == seen_count) { - u32 info = ed->hwINFO; - u32 scratch = cpu_to_le32p (&ed->hwINFO); - - temp = snprintf (next, size, - " (%cs dev%d%s ep%d%s" - " max %d %08x%s%s)", - (info & ED_LOWSPEED) ? 'l' : 'f', - scratch & 0x7f, - (info & ED_ISO) ? " iso" : "", - (scratch >> 7) & 0xf, - (info & ED_IN) ? "in" : "out", - 0x03ff & (scratch >> 16), - scratch, - (info & ED_SKIP) ? " s" : "", - (ed->hwHeadP & ED_H) ? " H" : ""); - size -= temp; - next += temp; - - // FIXME some TD info too - - if (seen_count < DBG_SCHED_LIMIT) - seen [seen_count++] = ed; - - ed = ed->ed_next; - - } else { - /* we've seen it and what's after */ - temp = 0; - ed = 0; - } - - } while (ed); - - temp = snprintf (next, size, "\n"); - size -= temp; - next += temp; - } - spin_unlock_irqrestore (&ohci->lock, flags); - kfree (seen); - - return PAGE_SIZE - size; -} -static DEVICE_ATTR (periodic, S_IRUGO, show_periodic, NULL); - - -#undef DBG_SCHED_LIMIT - -static ssize_t -show_registers (struct device *dev, char *buf) -{ - struct ohci_hcd *ohci; - struct ohci_regs *regs; - unsigned long flags; - unsigned temp, size; - char *next; - u32 rdata; - - ohci = dev_to_ohci(dev); - regs = ohci->regs; - next = buf; - size = PAGE_SIZE; - - spin_lock_irqsave (&ohci->lock, flags); - - /* dump driver info, then registers in spec order */ - - ohci_dbg_sw (ohci, &next, &size, - "%s version " DRIVER_VERSION "\n", hcd_name); - - ohci_dump_status(ohci, &next, &size); - - /* hcca */ - if (ohci->hcca) - ohci_dbg_sw (ohci, &next, &size, - "hcca frame 0x%04x\n", ohci->hcca->frame_no); - - /* other registers mostly affect frame timings */ - rdata = readl (®s->fminterval); - temp = snprintf (next, size, - "fmintvl 0x%08x %sFSMPS=0x%04x FI=0x%04x\n", - rdata, (rdata >> 31) ? " FIT" : "", - (rdata >> 16) & 0xefff, rdata & 0xffff); - size -= temp; - next += temp; - - rdata = readl (®s->fmremaining); - temp = snprintf (next, size, "fmremaining 0x%08x %sFR=0x%04x\n", - rdata, (rdata >> 31) ? " FRT" : "", - rdata & 0x3fff); - size -= temp; - next += temp; - - rdata = readl (®s->periodicstart); - temp = snprintf (next, size, "periodicstart 0x%04x\n", - rdata & 0x3fff); - size -= temp; - next += temp; - - rdata = readl (®s->lsthresh); - temp = snprintf (next, size, "lsthresh 0x%04x\n", - rdata & 0x3fff); - size -= temp; - next += temp; - - /* roothub */ - ohci_dump_roothub (ohci, 1, &next, &size); - - spin_unlock_irqrestore (&ohci->lock, flags); - - return PAGE_SIZE - size; -} -static DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL); - - -static inline void create_debug_files (struct ohci_hcd *bus) -{ - device_create_file (bus->hcd.controller, &dev_attr_async); - device_create_file (bus->hcd.controller, &dev_attr_periodic); - device_create_file (bus->hcd.controller, &dev_attr_registers); - ohci_dbg (bus, "created debug files\n"); -} - -static inline void remove_debug_files (struct ohci_hcd *bus) -{ - device_remove_file (bus->hcd.controller, &dev_attr_async); - device_remove_file (bus->hcd.controller, &dev_attr_periodic); - device_remove_file (bus->hcd.controller, &dev_attr_registers); -} - -#endif - -/*-------------------------------------------------------------------------*/ - diff --git a/lib/usb/host/ohci-hcd.c b/lib/usb/host/ohci-hcd.c deleted file mode 100644 index f25876c07..000000000 --- a/lib/usb/host/ohci-hcd.c +++ /dev/null @@ -1,703 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * [ Initialisation is based on Linus' ] - * [ uhci code and gregs ohci fragments ] - * [ (C) Copyright 1999 Linus Torvalds ] - * [ (C) Copyright 1999 Gregory P. Smith] - * - * - * OHCI is the main "non-Intel/VIA" standard for USB 1.1 host controller - * interfaces (though some non-x86 Intel chips use it). It supports - * smarter hardware than UHCI. A download link for the spec available - * through the http://www.usb.org website. - * - * History: - * - * 2003/02/24 show registers in sysfs (Kevin Brosius) - * - * 2002/09/03 get rid of ed hashtables, rework periodic scheduling and - * bandwidth accounting; if debugging, show schedules in driverfs - * 2002/07/19 fixes to management of ED and schedule state. - * 2002/06/09 SA-1111 support (Christopher Hoover) - * 2002/06/01 remember frame when HC won't see EDs any more; use that info - * to fix urb unlink races caused by interrupt latency assumptions; - * minor ED field and function naming updates - * 2002/01/18 package as a patch for 2.5.3; this should match the - * 2.4.17 kernel modulo some bugs being fixed. - * - * 2001/10/18 merge pmac cleanup (Benjamin Herrenschmidt) and bugfixes - * from post-2.4.5 patches. - * 2001/09/20 URB_ZERO_PACKET support; hcca_dma portability, OPTi warning - * 2001/09/07 match PCI PM changes, errnos from Linus' tree - * 2001/05/05 fork 2.4.5 version into "hcd" framework, cleanup, simplify; - * pbook pci quirks gone (please fix pbook pci sw!) (db) - * - * 2001/04/08 Identify version on module load (gb) - * 2001/03/24 td/ed hashing to remove bus_to_virt (Steve Longerbeam); - pci_map_single (db) - * 2001/03/21 td and dev/ed allocation uses new pci_pool API (db) - * 2001/03/07 hcca allocation uses pci_alloc_consistent (Steve Longerbeam) - * - * 2000/09/26 fixed races in removing the private portion of the urb - * 2000/09/07 disable bulk and control lists when unlinking the last - * endpoint descriptor in order to avoid unrecoverable errors on - * the Lucent chips. (rwc@sgi) - * 2000/08/29 use bandwidth claiming hooks (thanks Randy!), fix some - * urb unlink probs, indentation fixes - * 2000/08/11 various oops fixes mostly affecting iso and cleanup from - * device unplugs. - * 2000/06/28 use PCI hotplug framework, for better power management - * and for Cardbus support (David Brownell) - * 2000/earlier: fixes for NEC/Lucent chips; suspend/resume handling - * when the controller loses power; handle UE; cleanup; ... - * - * v5.2 1999/12/07 URB 3rd preview, - * v5.1 1999/11/30 URB 2nd preview, cpia, (usb-scsi) - * v5.0 1999/11/22 URB Technical preview, Paul Mackerras powerbook susp/resume - * i386: HUB, Keyboard, Mouse, Printer - * - * v4.3 1999/10/27 multiple HCs, bulk_request - * v4.2 1999/09/05 ISO API alpha, new dev alloc, neg Error-codes - * v4.1 1999/08/27 Randy Dunlap's - ISO API first impl. - * v4.0 1999/08/18 - * v3.0 1999/06/25 - * v2.1 1999/05/09 code clean up - * v2.0 1999/05/04 - * v1.0 1999/04/27 initial release - * - * This file is licenced under the GPL. - */ - -#if 0 -#include - -#ifdef CONFIG_USB_DEBUG -# define DEBUG -#else -# undef DEBUG -#endif - - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for in_interrupt () */ -#include -#include "../core/hcd.h" - -#include -#include -#include -#include -#include -#else -#include "ohci_config.h" - -#include "../usb_wrapper.h" -#include "../core/hcd.h" - -//#define OHCI_VERBOSE_DEBUG -#endif - -/* - * TO DO: - * - * - "disabled" and "sleeping" should be in hcd->state - * - lots more testing!! - */ - -#define DRIVER_VERSION "2003 Feb 24" -#define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" -#define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" - -/*-------------------------------------------------------------------------*/ - -// #define OHCI_VERBOSE_DEBUG /* not always helpful */ - -/* For initializing controller (mask in an HCFS mode too) */ -#define OHCI_CONTROL_INIT \ - (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE - -#define OHCI_UNLINK_TIMEOUT (HZ / 10) - -/*-------------------------------------------------------------------------*/ - -static const char hcd_name [] = "ohci-hcd"; - -#include "ohci.h" - -static inline void disable (struct ohci_hcd *ohci) -{ - ohci->disabled = 1; - ohci->hcd.state = USB_STATE_HALT; -} - -#include "ohci-hub.c" -#include "ohci-dbg.c" -#include "ohci-mem.c" -#include "ohci-q.c" - -/*-------------------------------------------------------------------------*/ - -/* - * queue up an urb for anything except the root hub - */ -static int ohci_urb_enqueue ( - struct usb_hcd *hcd, - struct urb *urb, - int mem_flags -) { - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - struct ed *ed; - urb_priv_t *urb_priv; - unsigned int pipe = urb->pipe; - int i, size = 0; - unsigned long flags; - int retval = 0; - -#ifdef OHCI_VERBOSE_DEBUG - urb_print (urb, "SUB", usb_pipein (pipe)); -#endif - - /* every endpoint has a ed, locate and maybe (re)initialize it */ - if (! (ed = ed_get (ohci, urb->dev, pipe, urb->interval))) - return -ENOMEM; - - /* for the private part of the URB we need the number of TDs (size) */ - switch (ed->type) { - case PIPE_CONTROL: - /* td_submit_urb() doesn't yet handle these */ - if (urb->transfer_buffer_length > 4096) - return -EMSGSIZE; - - /* 1 TD for setup, 1 for ACK, plus ... */ - size = 2; - /* FALLTHROUGH */ - // case PIPE_INTERRUPT: - // case PIPE_BULK: - default: - /* one TD for every 4096 Bytes (can be upto 8K) */ - size += urb->transfer_buffer_length / 4096; - /* ... and for any remaining bytes ... */ - if ((urb->transfer_buffer_length % 4096) != 0) - size++; - /* ... and maybe a zero length packet to wrap it up */ - if (size == 0) - size++; - else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0 - && (urb->transfer_buffer_length - % usb_maxpacket (urb->dev, pipe, - usb_pipeout (pipe))) == 0) - size++; - break; - case PIPE_ISOCHRONOUS: /* number of packets from URB */ - size = urb->number_of_packets; - break; - } - - /* allocate the private part of the URB */ - urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (struct td *), - mem_flags); - if (!urb_priv) - return -ENOMEM; - memset (urb_priv, 0, sizeof (urb_priv_t) + size * sizeof (struct td *)); - - /* fill the private part of the URB */ - urb_priv->length = size; - urb_priv->ed = ed; - - /* allocate the TDs (deferring hash chain updates) */ - for (i = 0; i < size; i++) { - urb_priv->td [i] = td_alloc (ohci, mem_flags); - if (!urb_priv->td [i]) { - urb_priv->length = i; - urb_free_priv (ohci, urb_priv); - return -ENOMEM; - } - } - - spin_lock_irqsave (&ohci->lock, flags); - - /* don't submit to a dead HC */ - if (ohci->disabled || ohci->sleeping) { - retval = -ENODEV; - goto fail; - } - - /* schedule the ed if needed */ - if (ed->state == ED_IDLE) { - retval = ed_schedule (ohci, ed); - if (retval < 0) - goto fail; - if (ed->type == PIPE_ISOCHRONOUS) { - u16 frame = le16_to_cpu (ohci->hcca->frame_no); - - /* delay a few frames before the first TD */ - frame += max_t (u16, 8, ed->interval); - frame &= ~(ed->interval - 1); - frame |= ed->branch; - urb->start_frame = frame; - - /* yes, only URB_ISO_ASAP is supported, and - * urb->start_frame is never used as input. - */ - } - } else if (ed->type == PIPE_ISOCHRONOUS) - urb->start_frame = ed->last_iso + ed->interval; - - /* fill the TDs and link them to the ed; and - * enable that part of the schedule, if needed - * and update count of queued periodic urbs - */ - urb->hcpriv = urb_priv; - td_submit_urb (ohci, urb); - -fail: - if (retval) - urb_free_priv (ohci, urb_priv); - spin_unlock_irqrestore (&ohci->lock, flags); - return retval; -} - -/* - * decouple the URB from the HC queues (TDs, urb_priv); it's - * already marked using urb->status. reporting is always done - * asynchronously, and we might be dealing with an urb that's - * partially transferred, or an ED with other urbs being unlinked. - */ -static int ohci_urb_dequeue (struct usb_hcd *hcd, struct urb *urb) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - unsigned long flags; - -#ifdef OHCI_VERBOSE_DEBUG - urb_print (urb, "UNLINK", 1); -#endif - - spin_lock_irqsave (&ohci->lock, flags); - if (!ohci->disabled) { - urb_priv_t *urb_priv; - - /* Unless an IRQ completed the unlink while it was being - * handed to us, flag it for unlink and giveback, and force - * some upcoming INTR_SF to call finish_unlinks() - */ - urb_priv = urb->hcpriv; - if (urb_priv) { - urb_priv->state = URB_DEL; - if (urb_priv->ed->state == ED_OPER) - start_urb_unlink (ohci, urb_priv->ed); - } - } else { - /* - * with HC dead, we won't respect hc queue pointers - * any more ... just clean up every urb's memory. - */ - if (urb->hcpriv) { - spin_unlock (&ohci->lock); - finish_urb (ohci, urb, NULL); - spin_lock (&ohci->lock); - } - } - spin_unlock_irqrestore (&ohci->lock, flags); - return 0; -} - -/*-------------------------------------------------------------------------*/ - -/* frees config/altsetting state for endpoints, - * including ED memory, dummy TD, and bulk/intr data toggle - */ - -static void -ohci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - int epnum = ep & USB_ENDPOINT_NUMBER_MASK; - unsigned long flags; - struct ed *ed; - - /* ASSERT: any requests/urbs are being unlinked */ - /* ASSERT: nobody can be submitting urbs for this any more */ - - epnum <<= 1; - if (epnum != 0 && !(ep & USB_DIR_IN)) - epnum |= 1; - -rescan: - spin_lock_irqsave (&ohci->lock, flags); - ed = dev->ep [epnum]; - if (!ed) - goto done; - - if (!HCD_IS_RUNNING (ohci->hcd.state) || ohci->disabled) - ed->state = ED_IDLE; - switch (ed->state) { - case ED_UNLINK: /* wait for hw to finish? */ - spin_unlock_irqrestore (&ohci->lock, flags); - set_current_state (TASK_UNINTERRUPTIBLE); - schedule_timeout (1); - goto rescan; - case ED_IDLE: /* fully unlinked */ - if (list_empty (&ed->td_list)) { - td_free (ohci, ed->dummy); - ed_free (ohci, ed); - break; - } - /* else FALL THROUGH */ - default: - /* caller was supposed to have unlinked any requests; - * that's not our job. can't recover; must leak ed. - */ - ohci_err (ohci, "ed %p (#%d) state %d%s\n", - ed, epnum, ed->state, - list_empty (&ed->td_list) ? "" : "(has tds)"); - td_free (ohci, ed->dummy); - break; - } - dev->ep [epnum] = 0; -done: - spin_unlock_irqrestore (&ohci->lock, flags); - return; -} - -static int ohci_get_frame (struct usb_hcd *hcd) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - - return le16_to_cpu (ohci->hcca->frame_no); -} - -/*-------------------------------------------------------------------------* - * HC functions - *-------------------------------------------------------------------------*/ - -/* reset the HC and BUS */ - -static int hc_reset (struct ohci_hcd *ohci) -{ - u32 temp; - u32 ints; - u32 control; - - /* Disable HC interrupts */ - writel (OHCI_INTR_MIE, &ohci->regs->intrdisable); - // acknowledge all pending interrupts - ints = readl(&ohci->regs->intrstatus); - writel (ints, &ohci->regs->intrstatus); - - if (readl (&ohci->regs->control) & OHCI_CTRL_IR) { - // takeover without negotiation - there is noone to negotiate with - control = readl (&ohci->regs->control) & ~OHCI_CTRL_IR; - writel (control, &ohci->regs->control); - } - - ohci_dbg (ohci, "USB HC reset_hc %s: ctrl = 0x%x ;\n", - hcd_to_bus (&ohci->hcd)->bus_name, - readl (&ohci->regs->control)); - - /* Reset USB (needed by some controllers); RemoteWakeupConnected - * saved if boot firmware (BIOS/SMM/...) told us it's connected - */ - ohci->hc_control = readl (&ohci->regs->control); - ohci->hc_control &= OHCI_CTRL_RWC; /* hcfs 0 = RESET */ - writel (ohci->hc_control, &ohci->regs->control); - // flush those pci writes - (void) readl (&ohci->regs->control); - wait_ms (50); - - /* HC Reset requires max 10 us delay */ - writel (OHCI_HCR, &ohci->regs->cmdstatus); - temp = 30; /* ... allow extra time */ - while ((readl (&ohci->regs->cmdstatus) & OHCI_HCR) != 0) { - if (--temp == 0) { - ohci_err (ohci, "USB HC reset timed out!\n"); - return -1; - } - udelay (1); - } - - /* now we're in the SUSPEND state ... must go OPERATIONAL - * within 2msec else HC enters RESUME - * - * ... but some hardware won't init fmInterval "by the book" - * (SiS, OPTi ...), so reset again instead. SiS doesn't need - * this if we write fmInterval after we're OPERATIONAL. - */ - writel (ohci->hc_control, &ohci->regs->control); - // flush those pci writes - (void) readl (&ohci->regs->control); - - return 0; -} - -/*-------------------------------------------------------------------------*/ - -#define FI 0x2edf /* 12000 bits per frame (-1) */ -#define LSTHRESH 0x628 /* lowspeed bit threshold */ - -/* Start an OHCI controller, set the BUS operational - * enable interrupts - * connect the virtual root hub - */ -static int hc_start (struct ohci_hcd *ohci) -{ - u32 mask, tmp; - struct usb_device *udev; - struct usb_bus *bus; - - spin_lock_init (&ohci->lock); - ohci->disabled = 1; - ohci->sleeping = 0; - - /* Tell the controller where the control and bulk lists are - * The lists are empty now. */ - writel (0, &ohci->regs->ed_controlhead); - writel (0, &ohci->regs->ed_bulkhead); - - /* a reset clears this */ - writel ((u32) ohci->hcca_dma, &ohci->regs->hcca); -// usbprintk("HCCA: %p \n",ohci->regs->hcca); - - /* force default fmInterval (we won't adjust it); init thresholds - * for last FS and LS packets, reserve 90% for periodic. - */ - writel ((((6 * (FI - 210)) / 7) << 16) | FI, &ohci->regs->fminterval); - writel (((9 * FI) / 10) & 0x3fff, &ohci->regs->periodicstart); - writel (LSTHRESH, &ohci->regs->lsthresh); - - /* some OHCI implementations are finicky about how they init. - * bogus values here mean not even enumeration could work. - */ - if ((readl (&ohci->regs->fminterval) & 0x3fff0000) == 0 - || !readl (&ohci->regs->periodicstart)) { - ohci_err (ohci, "init err\n"); - return -EOVERFLOW; - } - - /* start controller operations */ - ohci->hc_control &= OHCI_CTRL_RWC; - ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; - ohci->disabled = 0; - writel (ohci->hc_control, &ohci->regs->control); - - /* Choose the interrupts we care about now, others later on demand */ - mask = OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_WDH; - writel (mask, &ohci->regs->intrstatus); - writel (mask, &ohci->regs->intrenable); - - /* handle root hub init quirks ... */ - tmp = roothub_a (ohci); - tmp &= ~(RH_A_PSM | RH_A_OCPM); - if (ohci->flags & OHCI_QUIRK_SUPERIO) { - /* NSC 87560 and maybe others */ - tmp |= RH_A_NOCP; - tmp &= ~(RH_A_POTPGT | RH_A_NPS); - } else { - /* hub power always on; required for AMD-756 and some - * Mac platforms, use this mode everywhere by default - */ - tmp |= RH_A_NPS; - } - writel (tmp, &ohci->regs->roothub.a); - writel (RH_HS_LPSC, &ohci->regs->roothub.status); - writel (0, &ohci->regs->roothub.b); - // flush those pci writes - (void) readl (&ohci->regs->control); - - // POTPGT delay is bits 24-31, in 2 ms units. - mdelay ((roothub_a (ohci) >> 23) & 0x1fe); - - /* connect the virtual root hub */ - bus = hcd_to_bus (&ohci->hcd); - bus->root_hub = udev = usb_alloc_dev (NULL, bus); - ohci->hcd.state = USB_STATE_READY; - if (!udev) { - disable (ohci); - ohci->hc_control &= ~OHCI_CTRL_HCFS; - writel (ohci->hc_control, &ohci->regs->control); - ohci_err(ohci,"out of mem"); - return -ENOMEM; - } - - usb_connect (udev); - udev->speed = USB_SPEED_FULL; - if (hcd_register_root (&ohci->hcd) != 0) { - usb_put_dev (udev); - bus->root_hub = NULL; - disable (ohci); - ohci->hc_control &= ~OHCI_CTRL_HCFS; - writel (ohci->hc_control, &ohci->regs->control); - return -ENODEV; - } - create_debug_files (ohci); - return 0; -} - -/*-------------------------------------------------------------------------*/ - -/* an interrupt happens */ - -static void ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - struct ohci_regs *regs = ohci->regs; - int ints; - - /* we can eliminate a (slow) readl() if _only_ WDH caused this irq */ - if ((ohci->hcca->done_head != 0) - && ! (le32_to_cpup (&ohci->hcca->done_head) & 0x01)) { - ints = OHCI_INTR_WDH; - - /* cardbus/... hardware gone before remove() */ - } else if ((ints = readl (®s->intrstatus)) == ~(u32)0) { - disable (ohci); - ohci_dbg (ohci, "device removed!\n"); - return; - - /* interrupt for some other device? */ - } else if ((ints &= readl (®s->intrenable)) == 0) { - return; - } - - if (ints & OHCI_INTR_UE) { - disable (ohci); - ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); - // e.g. due to PCI Master/Target Abort - - ohci_dump (ohci, 1); - hc_reset (ohci); - } - - if (ints & OHCI_INTR_WDH) { - writel (OHCI_INTR_WDH, ®s->intrdisable); - dl_done_list (ohci, dl_reverse_done_list (ohci), ptregs); - writel (OHCI_INTR_WDH, ®s->intrenable); - } - - /* could track INTR_SO to reduce available PCI/... bandwidth */ - - /* handle any pending URB/ED unlinks, leaving INTR_SF enabled - * when there's still unlinking to be done (next frame). - */ - spin_lock (&ohci->lock); - if (ohci->ed_rm_list) - finish_unlinks (ohci, le16_to_cpu (ohci->hcca->frame_no), - ptregs); - if ((ints & OHCI_INTR_SF) != 0 && !ohci->ed_rm_list) - writel (OHCI_INTR_SF, ®s->intrdisable); - spin_unlock (&ohci->lock); - - writel (ints, ®s->intrstatus); - writel (OHCI_INTR_MIE, ®s->intrenable); - // flush those pci writes - (void) readl (&ohci->regs->control); -} - -/*-------------------------------------------------------------------------*/ - -static void ohci_stop (struct usb_hcd *hcd) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - struct ohci_regs *regs = ohci->regs; - int ints; - - ohci_dbg (ohci, "stop %s controller%s\n", - hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS), - ohci->disabled ? " (disabled)" : "" - ); - ohci_dump (ohci, 1); - - if (!ohci->disabled) - hc_reset (ohci); - - // Disable all interrupts - writel (OHCI_INTR_MIE, ®s->intrdisable); - // acknowledge all pending interrupts - ints = readl(®s->intrstatus); - writel (ints, ®s->intrstatus); - // flush register writes - (void) readl (&ohci->regs->control); - - remove_debug_files (ohci); - ohci_mem_cleanup (ohci); - if (ohci->hcca) { - pci_free_consistent (ohci->hcd.pdev, sizeof *ohci->hcca, - ohci->hcca, ohci->hcca_dma); - ohci->hcca = NULL; - ohci->hcca_dma = 0; - } -} - -/*-------------------------------------------------------------------------*/ - -// FIXME: this restart logic should be generic, -// and handle full hcd state cleanup - -/* controller died; cleanup debris, then restart */ -/* must not be called from interrupt context */ - -#ifdef CONFIG_PM -static int hc_restart (struct ohci_hcd *ohci) -{ - int temp; - int i; - - ohci->disabled = 1; - ohci->sleeping = 0; - if (hcd_to_bus (&ohci->hcd)->root_hub) - usb_disconnect (&hcd_to_bus (&ohci->hcd)->root_hub); - - /* empty the interrupt branches */ - for (i = 0; i < NUM_INTS; i++) ohci->load [i] = 0; - for (i = 0; i < NUM_INTS; i++) ohci->hcca->int_table [i] = 0; - - /* no EDs to remove */ - ohci->ed_rm_list = NULL; - - /* empty control and bulk lists */ - ohci->ed_controltail = NULL; - ohci->ed_bulktail = NULL; - - if ((temp = hc_reset (ohci)) < 0 || (temp = hc_start (ohci)) < 0) { - ohci_err (ohci, "can't restart, %d\n", temp); - return temp; - } else - ohci_dbg (ohci, "restart complete\n"); - return 0; -} -#endif - -/*-------------------------------------------------------------------------*/ - -#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC - -MODULE_AUTHOR (DRIVER_AUTHOR); -MODULE_DESCRIPTION (DRIVER_INFO); -MODULE_LICENSE ("GPL"); - -#ifdef CONFIG_PCI -#include "ohci-pci.c" -#endif - -#ifdef CONFIG_SA1111 -#include "ohci-sa1111.c" -#endif - -#if !(defined(CONFIG_PCI) || defined(CONFIG_SA1111)) -#error "missing bus glue for ohci-hcd" -#endif diff --git a/lib/usb/host/ohci-hub.c b/lib/usb/host/ohci-hub.c deleted file mode 100644 index a81191525..000000000 --- a/lib/usb/host/ohci-hub.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * This file is licenced under GPL - */ - -/*-------------------------------------------------------------------------*/ - -/* - * OHCI Root Hub ... the nonsharable stuff - * - * Registers don't need cpu_to_le32, that happens transparently - */ - -/* AMD-756 (D2 rev) reports corrupt register contents in some cases. - * The erratum (#4) description is incorrect. AMD's workaround waits - * till some bits (mostly reserved) are clear; ok for all revs. - */ -#define read_roothub(hc, register, mask) ({ \ - u32 temp = readl (&hc->regs->roothub.register); \ - if (temp == -1) \ - disable (hc); \ - else if (hc->flags & OHCI_QUIRK_AMD756) \ - while (temp & mask) \ - temp = readl (&hc->regs->roothub.register); \ - temp; }) - -static u32 roothub_a (struct ohci_hcd *hc) - { return read_roothub (hc, a, 0xfc0fe000); } -static inline u32 roothub_b (struct ohci_hcd *hc) - { return readl (&hc->regs->roothub.b); } -static inline u32 roothub_status (struct ohci_hcd *hc) - { return readl (&hc->regs->roothub.status); } -static u32 roothub_portstatus (struct ohci_hcd *hc, int i) - { return read_roothub (hc, portstatus [i], 0xffe0fce0); } - -/*-------------------------------------------------------------------------*/ - -#define dbg_port(hc,label,num,value) \ - ohci_dbg (hc, \ - "%s roothub.portstatus [%d] " \ - "= 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s\n", \ - label, num, temp, \ - (temp & RH_PS_PRSC) ? " PRSC" : "", \ - (temp & RH_PS_OCIC) ? " OCIC" : "", \ - (temp & RH_PS_PSSC) ? " PSSC" : "", \ - (temp & RH_PS_PESC) ? " PESC" : "", \ - (temp & RH_PS_CSC) ? " CSC" : "", \ - \ - (temp & RH_PS_LSDA) ? " LSDA" : "", \ - (temp & RH_PS_PPS) ? " PPS" : "", \ - (temp & RH_PS_PRS) ? " PRS" : "", \ - (temp & RH_PS_POCI) ? " POCI" : "", \ - (temp & RH_PS_PSS) ? " PSS" : "", \ - \ - (temp & RH_PS_PES) ? " PES" : "", \ - (temp & RH_PS_CCS) ? " CCS" : "" \ - ); - - -/*-------------------------------------------------------------------------*/ - -/* build "status change" packet (one or two bytes) from HC registers */ - -static int -ohci_hub_status_data (struct usb_hcd *hcd, char *buf) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - int ports, i, changed = 0, length = 1; - - ports = roothub_a (ohci) & RH_A_NDP; - if (ports > MAX_ROOT_PORTS) { - if (ohci->disabled) - return -ESHUTDOWN; - ohci_err (ohci, "bogus NDP=%d, rereads as NDP=%d\n", - ports, readl (&ohci->regs->roothub.a) & RH_A_NDP); - /* retry later; "should not happen" */ - return 0; - } - - /* init status */ - if (roothub_status (ohci) & (RH_HS_LPSC | RH_HS_OCIC)) - buf [0] = changed = 1; - else - buf [0] = 0; - if (ports > 7) { - buf [1] = 0; - length++; - } - - /* look at each port */ - for (i = 0; i < ports; i++) { - u32 status = roothub_portstatus (ohci, i); - - status &= RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC - | RH_PS_OCIC | RH_PS_PRSC; - if (status) { - changed = 1; - if (i < 7) - buf [0] |= 1 << (i + 1); - else - buf [1] |= 1 << (i - 7); - } - } - return changed ? length : 0; -} - -/*-------------------------------------------------------------------------*/ - -static void -ohci_hub_descriptor ( - struct ohci_hcd *ohci, - struct usb_hub_descriptor *desc -) { - u32 rh = roothub_a (ohci); - int ports = rh & RH_A_NDP; - u16 temp; - - desc->bDescriptorType = 0x29; - desc->bPwrOn2PwrGood = (rh & RH_A_POTPGT) >> 24; - desc->bHubContrCurrent = 0; - - desc->bNbrPorts = ports; - temp = 1 + (ports / 8); - desc->bDescLength = 7 + 2 * temp; - - temp = 0; - if (rh & RH_A_PSM) /* per-port power switching? */ - temp |= 0x0001; - if (rh & RH_A_NOCP) /* no overcurrent reporting? */ - temp |= 0x0010; - else if (rh & RH_A_OCPM) /* per-port overcurrent reporting? */ - temp |= 0x0008; - desc->wHubCharacteristics = cpu_to_le16 (temp); - - /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ - rh = roothub_b (ohci); - desc->bitmap [0] = rh & RH_B_DR; - if (ports > 7) { - desc->bitmap [1] = (rh & RH_B_DR) >> 8; - // desc->bitmap [2] = desc->bitmap [3] = 0xff; - } else - desc->bitmap [1] = 0xff; -} - -/*-------------------------------------------------------------------------*/ - -static int ohci_hub_control ( - struct usb_hcd *hcd, - u16 typeReq, - u16 wValue, - u16 wIndex, - char *buf, - u16 wLength -) { - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - int ports = hcd_to_bus (hcd)->root_hub->maxchild; - u32 temp; - int retval = 0; - - switch (typeReq) { - case ClearHubFeature: - switch (wValue) { - case C_HUB_OVER_CURRENT: - writel (RH_HS_OCIC, &ohci->regs->roothub.status); - case C_HUB_LOCAL_POWER: - break; - default: - goto error; - } - break; - case ClearPortFeature: - if (!wIndex || wIndex > ports) - goto error; - wIndex--; - - switch (wValue) { - case USB_PORT_FEAT_ENABLE: - temp = RH_PS_CCS; - break; - case USB_PORT_FEAT_C_ENABLE: - temp = RH_PS_PESC; - break; - case USB_PORT_FEAT_SUSPEND: - temp = RH_PS_POCI; - break; - case USB_PORT_FEAT_C_SUSPEND: - temp = RH_PS_PSSC; - break; - case USB_PORT_FEAT_POWER: - temp = RH_PS_LSDA; - break; - case USB_PORT_FEAT_C_CONNECTION: - temp = RH_PS_CSC; - break; - case USB_PORT_FEAT_C_OVER_CURRENT: - temp = RH_PS_OCIC; - break; - case USB_PORT_FEAT_C_RESET: - temp = RH_PS_PRSC; - break; - default: - goto error; - } - writel (temp, &ohci->regs->roothub.portstatus [wIndex]); - // readl (&ohci->regs->roothub.portstatus [wIndex]); - break; - case GetHubDescriptor: - ohci_hub_descriptor (ohci, (struct usb_hub_descriptor *) buf); - break; - case GetHubStatus: - temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); - *(u32 *) buf = cpu_to_le32 (temp); - break; - case GetPortStatus: - if (!wIndex || wIndex > ports) - goto error; - wIndex--; - temp = roothub_portstatus (ohci, wIndex); - *(u32 *) buf = cpu_to_le32 (temp); - -#ifndef OHCI_VERBOSE_DEBUG - if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ -#endif - dbg_port (ohci, "GetStatus", wIndex + 1, temp); - break; - case SetHubFeature: - switch (wValue) { - case C_HUB_OVER_CURRENT: - // FIXME: this can be cleared, yes? - case C_HUB_LOCAL_POWER: - break; - default: - goto error; - } - break; - case SetPortFeature: - if (!wIndex || wIndex > ports) - goto error; - wIndex--; - switch (wValue) { - case USB_PORT_FEAT_SUSPEND: - writel (RH_PS_PSS, - &ohci->regs->roothub.portstatus [wIndex]); - break; - case USB_PORT_FEAT_POWER: - writel (RH_PS_PPS, - &ohci->regs->roothub.portstatus [wIndex]); - break; - case USB_PORT_FEAT_RESET: - temp = readl (&ohci->regs->roothub.portstatus [wIndex]); - if (temp & RH_PS_CCS) - writel (RH_PS_PRS, - &ohci->regs->roothub.portstatus [wIndex]); - break; - default: - goto error; - } - break; - - default: -error: - /* "protocol stall" on error */ - retval = -EPIPE; - } - return retval; -} - diff --git a/lib/usb/host/ohci-mem.c b/lib/usb/host/ohci-mem.c deleted file mode 100644 index ae5a84c9c..000000000 --- a/lib/usb/host/ohci-mem.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * This file is licenced under the GPL. - */ - -/*-------------------------------------------------------------------------*/ - -/* - * There's basically three types of memory: - * - data used only by the HCD ... kmalloc is fine - * - async and periodic schedules, shared by HC and HCD ... these - * need to use pci_pool or pci_alloc_consistent - * - driver buffers, read/written by HC ... the hcd glue or the - * device driver provides us with dma addresses - * - * There's also PCI "register" data, which is memory mapped. - * No memory seen by this driver is pagable. - */ - -/*-------------------------------------------------------------------------*/ - -static struct usb_hcd *ohci_hcd_alloc (void) -{ - struct ohci_hcd *ohci; - - ohci = (struct ohci_hcd *) kmalloc (sizeof *ohci, GFP_KERNEL); - if (ohci != 0) { - memset (ohci, 0, sizeof (struct ohci_hcd)); - return &ohci->hcd; - } - return 0; -} - -static void ohci_hcd_free (struct usb_hcd *hcd) -{ - kfree (hcd_to_ohci (hcd)); -} - -/*-------------------------------------------------------------------------*/ - -static int ohci_mem_init (struct ohci_hcd *ohci) -{ - ohci->td_cache = pci_pool_create ("ohci_td", ohci->hcd.pdev, - sizeof (struct td), - 32 /* byte alignment */, - 0 /* no page-crossing issues */); - if (!ohci->td_cache) - return -ENOMEM; - ohci->ed_cache = pci_pool_create ("ohci_ed", ohci->hcd.pdev, - sizeof (struct ed), - 16 /* byte alignment */, - 0 /* no page-crossing issues */); - if (!ohci->ed_cache) { - pci_pool_destroy (ohci->td_cache); - return -ENOMEM; - } - return 0; -} - -static void ohci_mem_cleanup (struct ohci_hcd *ohci) -{ - if (ohci->td_cache) { - pci_pool_destroy (ohci->td_cache); - ohci->td_cache = 0; - } - if (ohci->ed_cache) { - pci_pool_destroy (ohci->ed_cache); - ohci->ed_cache = 0; - } -} - -/*-------------------------------------------------------------------------*/ - -/* ohci "done list" processing needs this mapping */ -static inline struct td * -dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma) -{ - struct td *td; - - td_dma &= TD_MASK; - td = hc->td_hash [TD_HASH_FUNC(td_dma)]; - while (td && td->td_dma != td_dma) - td = td->td_hash; - return td; -} - -/* TDs ... */ -static struct td * -td_alloc (struct ohci_hcd *hc, int mem_flags) -{ - dma_addr_t dma; - struct td *td; - - td = pci_pool_alloc (hc->td_cache, sizeof(*td)/*mem_flags*/, &dma); - if (td) { - /* in case hc fetches it, make it look dead */ - memset (td, 0, sizeof *td); - td->hwNextTD = cpu_to_le32 (dma); - td->td_dma = dma; - /* hashed in td_fill */ - } - return td; -} - -static void -td_free (struct ohci_hcd *hc, struct td *td) -{ - struct td **prev = &hc->td_hash [TD_HASH_FUNC (td->td_dma)]; - - while (*prev && *prev != td) - prev = &(*prev)->td_hash; - if (*prev) - *prev = td->td_hash; - else if ((td->hwINFO & TD_DONE) != 0) - ohci_dbg (hc, "no hash for td %p\n", td); - pci_pool_free (hc->td_cache, td, td->td_dma); -} - -/*-------------------------------------------------------------------------*/ - -/* EDs ... */ -static struct ed * -ed_alloc (struct ohci_hcd *hc, int mem_flags) -{ - dma_addr_t dma; - struct ed *ed; - - ed = pci_pool_alloc (hc->ed_cache, sizeof(*ed)/*mem_flags*/, &dma); - if (ed) { - memset (ed, 0, sizeof (*ed)); - INIT_LIST_HEAD (&ed->td_list); - ed->dma = dma; - } - return ed; -} - -static void -ed_free (struct ohci_hcd *hc, struct ed *ed) -{ - pci_pool_free (hc->ed_cache, ed, ed->dma); -} - diff --git a/lib/usb/host/ohci-pci.c b/lib/usb/host/ohci-pci.c deleted file mode 100644 index 911a52f9e..000000000 --- a/lib/usb/host/ohci-pci.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * [ Initialisation is based on Linus' ] - * [ uhci code and gregs ohci fragments ] - * [ (C) Copyright 1999 Linus Torvalds ] - * [ (C) Copyright 1999 Gregory P. Smith] - * - * PCI Bus Glue - * - * This file is licenced under the GPL. - */ - -#ifdef CONFIG_PMAC_PBOOK -#include -#include -#include -#include -#ifndef CONFIG_PM -# define CONFIG_PM -#endif -#endif - -#ifndef CONFIG_PCI -#error "This file is PCI bus glue. CONFIG_PCI must be defined." -#endif - -/*-------------------------------------------------------------------------*/ - -static int __devinit -ohci_pci_start (struct usb_hcd *hcd) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - int ret; - - if (hcd->pdev) { - ohci->hcca = pci_alloc_consistent (hcd->pdev, - sizeof *ohci->hcca, &ohci->hcca_dma); - if (!ohci->hcca) - return -ENOMEM; - - /* AMD 756, for most chips (early revs), corrupts register - * values on read ... so enable the vendor workaround. - */ - if (hcd->pdev->vendor == PCI_VENDOR_ID_AMD - && hcd->pdev->device == 0x740c) { - ohci->flags = OHCI_QUIRK_AMD756; - ohci_info (ohci, "AMD756 erratum 4 workaround\n"); - } - - /* FIXME for some of the early AMD 760 southbridges, OHCI - * won't work at all. blacklist them. - */ - - /* Apple's OHCI driver has a lot of bizarre workarounds - * for this chip. Evidently control and bulk lists - * can get confused. (B&W G3 models, and ...) - */ - else if (hcd->pdev->vendor == PCI_VENDOR_ID_OPTI - && hcd->pdev->device == 0xc861) { - ohci_info (ohci, - "WARNING: OPTi workarounds unavailable\n"); - } - - /* Check for NSC87560. We have to look at the bridge (fn1) to - * identify the USB (fn2). This quirk might apply to more or - * even all NSC stuff. - */ - else if (hcd->pdev->vendor == PCI_VENDOR_ID_NS) { - struct pci_dev *b, *hc; - - hc = hcd->pdev; - b = pci_find_slot (hc->bus->number, - PCI_DEVFN (PCI_SLOT (hc->devfn), 1)); - if (b && b->device == PCI_DEVICE_ID_NS_87560_LIO - && b->vendor == PCI_VENDOR_ID_NS) { - ohci->flags |= OHCI_QUIRK_SUPERIO; - ohci_info (ohci, "Using NSC SuperIO setup\n"); - } - } - - } - - memset (ohci->hcca, 0, sizeof (struct ohci_hcca)); - if ((ret = ohci_mem_init (ohci)) < 0) { - ohci_stop (hcd); - return ret; - } - ohci->regs = hcd->regs; - - if (hc_reset (ohci) < 0) { - ohci_stop (hcd); - return -ENODEV; - } - - if (hc_start (ohci) < 0) { - ohci_err (ohci, "can't start\n"); - ohci_stop (hcd); - return -EBUSY; - } - -#ifdef DEBUG - ohci_dump (ohci, 1); -#endif - return 0; -} - -#ifdef CONFIG_PM - -static int ohci_pci_suspend (struct usb_hcd *hcd, u32 state) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - unsigned long flags; - u16 cmd; - - if ((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER) { - ohci_dbg (ohci, "can't suspend (state is %s)\n", - hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS)); - return -EIO; - } - - /* act as if usb suspend can always be used */ - ohci_dbg (ohci, "suspend to %d\n", state); - ohci->sleeping = 1; - - /* First stop processing */ - spin_lock_irqsave (&ohci->lock, flags); - ohci->hc_control &= - ~(OHCI_CTRL_PLE|OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_IE); - writel (ohci->hc_control, &ohci->regs->control); - writel (OHCI_INTR_SF, &ohci->regs->intrstatus); - (void) readl (&ohci->regs->intrstatus); - spin_unlock_irqrestore (&ohci->lock, flags); - - /* Wait a frame or two */ - mdelay (1); - if (!readl (&ohci->regs->intrstatus) & OHCI_INTR_SF) - mdelay (1); - -#ifdef CONFIG_PMAC_PBOOK - if (_machine == _MACH_Pmac) - disable_irq (hcd->pdev->irq); - /* else, 2.4 assumes shared irqs -- don't disable */ -#endif - - /* Enable remote wakeup */ - writel (readl (&ohci->regs->intrenable) | OHCI_INTR_RD, - &ohci->regs->intrenable); - - /* Suspend chip and let things settle down a bit */ - ohci->hc_control = OHCI_USB_SUSPEND; - writel (ohci->hc_control, &ohci->regs->control); - (void) readl (&ohci->regs->control); - mdelay (500); /* No schedule here ! */ - - switch (readl (&ohci->regs->control) & OHCI_CTRL_HCFS) { - case OHCI_USB_RESET: - ohci_dbg (ohci, "suspend->reset ?\n"); - break; - case OHCI_USB_RESUME: - ohci_dbg (ohci, "suspend->resume ?\n"); - break; - case OHCI_USB_OPER: - ohci_dbg (ohci, "suspend->operational ?\n"); - break; - case OHCI_USB_SUSPEND: - ohci_dbg (ohci, "suspended\n"); - break; - } - - /* In some rare situations, Apple's OHCI have happily trashed - * memory during sleep. We disable its bus master bit during - * suspend - */ - pci_read_config_word (hcd->pdev, PCI_COMMAND, &cmd); - cmd &= ~PCI_COMMAND_MASTER; - pci_write_config_word (hcd->pdev, PCI_COMMAND, cmd); -#ifdef CONFIG_PMAC_PBOOK - { - struct device_node *of_node; - - /* Disable USB PAD & cell clock */ - of_node = pci_device_to_OF_node (hcd->pdev); - if (of_node) - pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0); - } -#endif - return 0; -} - - -static int ohci_pci_resume (struct usb_hcd *hcd) -{ - struct ohci_hcd *ohci = hcd_to_ohci (hcd); - int temp; - int retval = 0; - unsigned long flags; - -#ifdef CONFIG_PMAC_PBOOK - { - struct device_node *of_node; - - /* Re-enable USB PAD & cell clock */ - of_node = pci_device_to_OF_node (hcd->pdev); - if (of_node) - pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1); - } -#endif - /* did we suspend, or were we powered off? */ - ohci->hc_control = readl (&ohci->regs->control); - temp = ohci->hc_control & OHCI_CTRL_HCFS; - -#ifdef DEBUG - /* the registers may look crazy here */ - ohci_dump_status (ohci, 0, 0); -#endif - - /* Re-enable bus mastering */ - pci_set_master (ohci->hcd.pdev); - - switch (temp) { - - case OHCI_USB_RESET: // lost power - ohci_info (ohci, "USB restart\n"); - retval = hc_restart (ohci); - break; - - case OHCI_USB_SUSPEND: // host wakeup - case OHCI_USB_RESUME: // remote wakeup - ohci_info (ohci, "USB continue from %s wakeup\n", - (temp == OHCI_USB_SUSPEND) - ? "host" : "remote"); - ohci->hc_control = OHCI_USB_RESUME; - writel (ohci->hc_control, &ohci->regs->control); - (void) readl (&ohci->regs->control); - mdelay (20); /* no schedule here ! */ - /* Some controllers (lucent) need a longer delay here */ - mdelay (15); - - temp = readl (&ohci->regs->control); - temp = ohci->hc_control & OHCI_CTRL_HCFS; - if (temp != OHCI_USB_RESUME) { - ohci_err (ohci, "controller won't resume\n"); - ohci->disabled = 1; - retval = -EIO; - break; - } - - /* Some chips likes being resumed first */ - writel (OHCI_USB_OPER, &ohci->regs->control); - (void) readl (&ohci->regs->control); - mdelay (3); - - /* Then re-enable operations */ - spin_lock_irqsave (&ohci->lock, flags); - ohci->disabled = 0; - ohci->sleeping = 0; - ohci->hc_control = OHCI_CONTROL_INIT | OHCI_USB_OPER; - if (!ohci->ed_rm_list) { - if (ohci->ed_controltail) - ohci->hc_control |= OHCI_CTRL_CLE; - if (ohci->ed_bulktail) - ohci->hc_control |= OHCI_CTRL_BLE; - } - hcd->state = USB_STATE_READY; - writel (ohci->hc_control, &ohci->regs->control); - - /* trigger a start-frame interrupt (why?) */ - writel (OHCI_INTR_SF, &ohci->regs->intrstatus); - writel (OHCI_INTR_SF, &ohci->regs->intrenable); - - /* Check for a pending done list */ - writel (OHCI_INTR_WDH, &ohci->regs->intrdisable); - (void) readl (&ohci->regs->intrdisable); - spin_unlock_irqrestore (&ohci->lock, flags); - -#ifdef CONFIG_PMAC_PBOOK - if (_machine == _MACH_Pmac) - enable_irq (hcd->pdev->irq); -#endif - if (ohci->hcca->done_head) - dl_done_list (ohci, dl_reverse_done_list (ohci), NULL); - writel (OHCI_INTR_WDH, &ohci->regs->intrenable); - - /* assume there are TDs on the bulk and control lists */ - writel (OHCI_BLF | OHCI_CLF, &ohci->regs->cmdstatus); - -// ohci_dump_status (ohci); -ohci_dbg (ohci, "sleeping = %d, disabled = %d\n", - ohci->sleeping, ohci->disabled); - break; - - default: - ohci_warn (ohci, "odd PCI resume\n"); - } - return retval; -} - -#endif /* CONFIG_PM */ - - -/*-------------------------------------------------------------------------*/ - -static const struct hc_driver ohci_pci_hc_driver = { - .description = hcd_name, - - /* - * generic hardware linkage - */ - .irq = ohci_irq, - .flags = HCD_MEMORY | HCD_USB11, - - /* - * basic lifecycle operations - */ - .start = ohci_pci_start, -#ifdef CONFIG_PM - .suspend = ohci_pci_suspend, - .resume = ohci_pci_resume, -#endif - .stop = ohci_stop, - - /* - * memory lifecycle (except per-request) - */ - .hcd_alloc = ohci_hcd_alloc, - .hcd_free = ohci_hcd_free, - - /* - * managing i/o requests and associated device resources - */ - .urb_enqueue = ohci_urb_enqueue, - .urb_dequeue = ohci_urb_dequeue, - .endpoint_disable = ohci_endpoint_disable, - - /* - * scheduling support - */ - .get_frame_number = ohci_get_frame, - - /* - * root hub support - */ - .hub_status_data = ohci_hub_status_data, - .hub_control = ohci_hub_control, -}; - -/*-------------------------------------------------------------------------*/ - -static const struct pci_device_id __devinitdata pci_ids [] = { { - - /* handle any USB OHCI controller */ - .class = (PCI_CLASS_SERIAL_USB << 8) | 0x10, - .class_mask = ~0, - .driver_data = (unsigned long) &ohci_pci_hc_driver, - - /* no matter who makes it */ - .vendor = PCI_ANY_ID, - .device = PCI_ANY_ID, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - - }, { /* end: all zeroes */ } -}; -MODULE_DEVICE_TABLE (pci, pci_ids); - -/* pci driver glue; this is a "new style" PCI driver module */ -static struct pci_driver ohci_pci_driver = { - .name = (char *) hcd_name, - .id_table = pci_ids, - - .probe = usb_hcd_pci_probe, - .remove = usb_hcd_pci_remove, - -#ifdef CONFIG_PM - .suspend = usb_hcd_pci_suspend, - .resume = usb_hcd_pci_resume, -#endif -}; - - -static int __init ohci_hcd_pci_init (void) -{ - printk (KERN_DEBUG "%s: " DRIVER_INFO " (PCI)\n", hcd_name); - if (usb_disabled()) - return -ENODEV; - - printk (KERN_DEBUG "%s: block sizes: ed %Zd td %Zd\n", hcd_name, - sizeof (struct ed), sizeof (struct td)); - return pci_module_init (&ohci_pci_driver); -} -module_init (ohci_hcd_pci_init); - -/*-------------------------------------------------------------------------*/ - -static void __exit ohci_hcd_pci_cleanup (void) -{ - pci_unregister_driver (&ohci_pci_driver); -} -module_exit (ohci_hcd_pci_cleanup); diff --git a/lib/usb/host/ohci-q.c b/lib/usb/host/ohci-q.c deleted file mode 100644 index 1a8d8175d..000000000 --- a/lib/usb/host/ohci-q.c +++ /dev/null @@ -1,1019 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * This file is licenced under the GPL. - */ - -static void urb_free_priv (struct ohci_hcd *hc, urb_priv_t *urb_priv) -{ - int last = urb_priv->length - 1; - - if (last >= 0) { - int i; - struct td *td; - - for (i = 0; i <= last; i++) { - td = urb_priv->td [i]; - if (td) - td_free (hc, td); - } - } - - kfree (urb_priv); -} - -/*-------------------------------------------------------------------------*/ - -/* - * URB goes back to driver, and isn't reissued. - * It's completely gone from HC data structures. - * PRECONDITION: no locks held, irqs blocked (Giveback can call into HCD.) - */ -static void -finish_urb (struct ohci_hcd *ohci, struct urb *urb, struct pt_regs *regs) -{ - // ASSERT (urb->hcpriv != 0); - - urb_free_priv (ohci, urb->hcpriv); - urb->hcpriv = NULL; - - spin_lock (&urb->lock); - if (likely (urb->status == -EINPROGRESS)) - urb->status = 0; - spin_unlock (&urb->lock); - - // what lock protects these? - switch (usb_pipetype (urb->pipe)) { - case PIPE_ISOCHRONOUS: - hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs--; - break; - case PIPE_INTERRUPT: - hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs--; - break; - } - -#ifdef OHCI_VERBOSE_DEBUG - urb_print (urb, "RET", usb_pipeout (urb->pipe)); -#endif - usb_hcd_giveback_urb (&ohci->hcd, urb, regs); -} - - -/*-------------------------------------------------------------------------* - * ED handling functions - *-------------------------------------------------------------------------*/ - -/* search for the right schedule branch to use for a periodic ed. - * does some load balancing; returns the branch, or negative errno. - */ -static int balance (struct ohci_hcd *ohci, int interval, int load) -{ - int i, branch = -ENOSPC; - - /* iso periods can be huge; iso tds specify frame numbers */ - if (interval > NUM_INTS) - interval = NUM_INTS; - - /* search for the least loaded schedule branch of that period - * that has enough bandwidth left unreserved. - */ - for (i = 0; i < interval ; i++) { - if (branch < 0 || ohci->load [branch] > ohci->load [i]) { -#if 1 /* CONFIG_USB_BANDWIDTH */ - int j; - - /* usb 1.1 says 90% of one frame */ - for (j = i; j < NUM_INTS; j += interval) { - if ((ohci->load [j] + load) > 900) - break; - } - if (j < NUM_INTS) - continue; -#endif - branch = i; - } - } - return branch; -} - -/*-------------------------------------------------------------------------*/ - -/* both iso and interrupt requests have periods; this routine puts them - * into the schedule tree in the apppropriate place. most iso devices use - * 1msec periods, but that's not required. - */ -static void periodic_link (struct ohci_hcd *ohci, struct ed *ed) -{ - unsigned i; - - ohci_vdbg (ohci, "link %sed %p branch %d [%dus.], interval %d\n", - (ed->hwINFO & ED_ISO) ? "iso " : "", - ed, ed->branch, ed->load, ed->interval); - - for (i = ed->branch; i < NUM_INTS; i += ed->interval) { - struct ed **prev = &ohci->periodic [i]; - u32 *prev_p = &ohci->hcca->int_table [i]; - struct ed *here = *prev; - - /* sorting each branch by period (slow before fast) - * lets us share the faster parts of the tree. - * (plus maybe: put interrupt eds before iso) - */ - while (here && ed != here) { - if (ed->interval > here->interval) - break; - prev = &here->ed_next; - prev_p = &here->hwNextED; - here = *prev; - } - if (ed != here) { - ed->ed_next = here; - if (here) - ed->hwNextED = *prev_p; - wmb (); - *prev = ed; - *prev_p = cpu_to_le32p (&ed->dma); - } - ohci->load [i] += ed->load; - } - hcd_to_bus (&ohci->hcd)->bandwidth_allocated += ed->load / ed->interval; -} - -/* link an ed into one of the HC chains */ - -static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed) -{ - int branch; - - ed->state = ED_OPER; - ed->ed_prev = 0; - ed->ed_next = 0; - ed->hwNextED = 0; - wmb (); - - /* we care about rm_list when setting CLE/BLE in case the HC was at - * work on some TD when CLE/BLE was turned off, and isn't quiesced - * yet. finish_unlinks() restarts as needed, some upcoming INTR_SF. - * - * control and bulk EDs are doubly linked (ed_next, ed_prev), but - * periodic ones are singly linked (ed_next). that's because the - * periodic schedule encodes a tree like figure 3-5 in the ohci - * spec: each qh can have several "previous" nodes, and the tree - * doesn't have unused/idle descriptors. - */ - switch (ed->type) { - case PIPE_CONTROL: - if (ohci->ed_controltail == NULL) { - writel (ed->dma, &ohci->regs->ed_controlhead); - } else { - ohci->ed_controltail->ed_next = ed; - ohci->ed_controltail->hwNextED = cpu_to_le32 (ed->dma); - } - ed->ed_prev = ohci->ed_controltail; - if (!ohci->ed_controltail && !ohci->ed_rm_list) { - ohci->hc_control |= OHCI_CTRL_CLE; - writel (0, &ohci->regs->ed_controlcurrent); - writel (ohci->hc_control, &ohci->regs->control); - } - ohci->ed_controltail = ed; - break; - - case PIPE_BULK: - if (ohci->ed_bulktail == NULL) { - writel (ed->dma, &ohci->regs->ed_bulkhead); - } else { - ohci->ed_bulktail->ed_next = ed; - ohci->ed_bulktail->hwNextED = cpu_to_le32 (ed->dma); - } - ed->ed_prev = ohci->ed_bulktail; - if (!ohci->ed_bulktail && !ohci->ed_rm_list) { - ohci->hc_control |= OHCI_CTRL_BLE; - writel (0, &ohci->regs->ed_bulkcurrent); - writel (ohci->hc_control, &ohci->regs->control); - } - ohci->ed_bulktail = ed; - break; - - // case PIPE_INTERRUPT: - // case PIPE_ISOCHRONOUS: - default: - branch = balance (ohci, ed->interval, ed->load); - if (branch < 0) { - ohci_dbg (ohci, - "ERR %d, interval %d msecs, load %d\n", - branch, ed->interval, ed->load); - // FIXME if there are TDs queued, fail them! - return branch; - } - ed->branch = branch; - periodic_link (ohci, ed); - } - - /* the HC may not see the schedule updates yet, but if it does - * then they'll be properly ordered. - */ - return 0; -} - -/*-------------------------------------------------------------------------*/ - -/* scan the periodic table to find and unlink this ED */ -static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed) -{ - int i; - - for (i = ed->branch; i < NUM_INTS; i += ed->interval) { - struct ed *temp; - struct ed **prev = &ohci->periodic [i]; - u32 *prev_p = &ohci->hcca->int_table [i]; - - while (*prev && (temp = *prev) != ed) { - prev_p = &temp->hwNextED; - prev = &temp->ed_next; - } - if (*prev) { - *prev_p = ed->hwNextED; - *prev = ed->ed_next; - } - ohci->load [i] -= ed->load; - } - hcd_to_bus (&ohci->hcd)->bandwidth_allocated -= ed->load / ed->interval; - - ohci_vdbg (ohci, "unlink %sed %p branch %d [%dus.], interval %d\n", - (ed->hwINFO & ED_ISO) ? "iso " : "", - ed, ed->branch, ed->load, ed->interval); -} - -/* unlink an ed from one of the HC chains. - * just the link to the ed is unlinked. - * the link from the ed still points to another operational ed or 0 - * so the HC can eventually finish the processing of the unlinked ed - */ -static void ed_deschedule (struct ohci_hcd *ohci, struct ed *ed) -{ - ed->hwINFO |= ED_SKIP; - - switch (ed->type) { - case PIPE_CONTROL: - if (ed->ed_prev == NULL) { - if (!ed->hwNextED) { - ohci->hc_control &= ~OHCI_CTRL_CLE; - writel (ohci->hc_control, &ohci->regs->control); - writel (0, &ohci->regs->ed_controlcurrent); - // post those pci writes - (void) readl (&ohci->regs->control); - } - writel (le32_to_cpup (&ed->hwNextED), - &ohci->regs->ed_controlhead); - } else { - ed->ed_prev->ed_next = ed->ed_next; - ed->ed_prev->hwNextED = ed->hwNextED; - } - if (ohci->ed_controltail == ed) { - ohci->ed_controltail = ed->ed_prev; - if (ohci->ed_controltail) - ohci->ed_controltail->ed_next = 0; - } else if (ed->ed_next) { - ed->ed_next->ed_prev = ed->ed_prev; - } - break; - - case PIPE_BULK: - if (ed->ed_prev == NULL) { - if (!ed->hwNextED) { - ohci->hc_control &= ~OHCI_CTRL_BLE; - writel (ohci->hc_control, &ohci->regs->control); - writel (0, &ohci->regs->ed_bulkcurrent); - // post those pci writes - (void) readl (&ohci->regs->control); - } - writel (le32_to_cpup (&ed->hwNextED), - &ohci->regs->ed_bulkhead); - } else { - ed->ed_prev->ed_next = ed->ed_next; - ed->ed_prev->hwNextED = ed->hwNextED; - } - if (ohci->ed_bulktail == ed) { - ohci->ed_bulktail = ed->ed_prev; - if (ohci->ed_bulktail) - ohci->ed_bulktail->ed_next = 0; - } else if (ed->ed_next) { - ed->ed_next->ed_prev = ed->ed_prev; - } - break; - - // case PIPE_INTERRUPT: - // case PIPE_ISOCHRONOUS: - default: - periodic_unlink (ohci, ed); - break; - } - - /* NOTE: Except for a couple of exceptionally clean unlink cases - * (like unlinking the only c/b ED, with no TDs) HCs may still be - * caching this operational ED (or its address). Safe unlinking - * involves not marking it ED_IDLE till INTR_SF; we always do that - * if td_list isn't empty. Otherwise the race is small; but ... - */ - if (ed->state == ED_OPER) { - ed->state = ED_IDLE; - ed->hwINFO &= ~(ED_SKIP | ED_DEQUEUE); - ed->hwHeadP &= ~ED_H; - wmb (); - } -} - - -/*-------------------------------------------------------------------------*/ - -/* get and maybe (re)init an endpoint. init _should_ be done only as part - * of usb_set_configuration() or usb_set_interface() ... but the USB stack - * isn't very stateful, so we re-init whenever the HC isn't looking. - */ -static struct ed *ed_get ( - struct ohci_hcd *ohci, - struct usb_device *udev, - unsigned int pipe, - int interval -) { - int is_out = !usb_pipein (pipe); - int type = usb_pipetype (pipe); - struct hcd_dev *dev = (struct hcd_dev *) udev->hcpriv; - struct ed *ed; - unsigned ep; - unsigned long flags; - - ep = usb_pipeendpoint (pipe) << 1; - if (type != PIPE_CONTROL && is_out) - ep |= 1; - - spin_lock_irqsave (&ohci->lock, flags); - - if (!(ed = dev->ep [ep])) { - struct td *td; - - ed = ed_alloc (ohci, SLAB_ATOMIC); - if (!ed) { - /* out of memory */ - goto done; - } - dev->ep [ep] = ed; - - /* dummy td; end of td list for ed */ - td = td_alloc (ohci, SLAB_ATOMIC); - if (!td) { - /* out of memory */ - ed_free (ohci, ed); - ed = 0; - goto done; - } - ed->dummy = td; - ed->hwTailP = cpu_to_le32 (td->td_dma); - ed->hwHeadP = ed->hwTailP; /* ED_C, ED_H zeroed */ - ed->state = ED_IDLE; - ed->type = type; - } - - /* NOTE: only ep0 currently needs this "re"init logic, during - * enumeration (after set_address, or if ep0 maxpacket >8). - */ - if (ed->state == ED_IDLE) { - u32 info; - - info = usb_pipedevice (pipe); - info |= (ep >> 1) << 7; - info |= usb_maxpacket (udev, pipe, is_out) << 16; - info = cpu_to_le32 (info); - if (udev->speed == USB_SPEED_LOW) - info |= ED_LOWSPEED; - /* only control transfers store pids in tds */ - if (type != PIPE_CONTROL) { - info |= is_out ? ED_OUT : ED_IN; - if (type != PIPE_BULK) { - /* periodic transfers... */ - if (type == PIPE_ISOCHRONOUS) - info |= ED_ISO; - else if (interval > 32) /* iso can be bigger */ - interval = 32; - ed->interval = interval; - ed->load = usb_calc_bus_time ( - udev->speed, !is_out, - type == PIPE_ISOCHRONOUS, - usb_maxpacket (udev, pipe, is_out)) - / 1000; - } - } - ed->hwINFO = info; - } - -done: - spin_unlock_irqrestore (&ohci->lock, flags); - return ed; -} - -/*-------------------------------------------------------------------------*/ - -/* request unlinking of an endpoint from an operational HC. - * put the ep on the rm_list - * real work is done at the next start frame (SF) hardware interrupt - */ -static void start_urb_unlink (struct ohci_hcd *ohci, struct ed *ed) -{ - ed->hwINFO |= ED_DEQUEUE; - ed->state = ED_UNLINK; - ed_deschedule (ohci, ed); - - /* SF interrupt might get delayed; record the frame counter value that - * indicates when the HC isn't looking at it, so concurrent unlinks - * behave. frame_no wraps every 2^16 msec, and changes right before - * SF is triggered. - */ - ed->tick = le16_to_cpu (ohci->hcca->frame_no) + 1; - - /* rm_list is just singly linked, for simplicity */ - ed->ed_next = ohci->ed_rm_list; - ed->ed_prev = 0; - ohci->ed_rm_list = ed; - - /* enable SOF interrupt */ - if (!ohci->sleeping) { - writel (OHCI_INTR_SF, &ohci->regs->intrstatus); - writel (OHCI_INTR_SF, &ohci->regs->intrenable); - // flush those pci writes - (void) readl (&ohci->regs->control); - } -} - -/*-------------------------------------------------------------------------* - * TD handling functions - *-------------------------------------------------------------------------*/ - -/* enqueue next TD for this URB (OHCI spec 5.2.8.2) */ - -static void -td_fill (struct ohci_hcd *ohci, u32 info, - dma_addr_t data, int len, - struct urb *urb, int index) -{ - struct td *td, *td_pt; - struct urb_priv *urb_priv = urb->hcpriv; - int is_iso = info & TD_ISO; - int hash; - - // ASSERT (index < urb_priv->length); - - /* aim for only one interrupt per urb. mostly applies to control - * and iso; other urbs rarely need more than one TD per urb. - * this way, only final tds (or ones with an error) cause IRQs. - * at least immediately; use DI=6 in case any control request is - * tempted to die part way through. - * - * NOTE: could delay interrupts even for the last TD, and get fewer - * interrupts ... increasing per-urb latency by sharing interrupts. - * Drivers that queue bulk urbs may request that behavior. - */ - if (index != (urb_priv->length - 1) - || (urb->transfer_flags & URB_NO_INTERRUPT)) - info |= TD_DI_SET (6); - - /* use this td as the next dummy */ - td_pt = urb_priv->td [index]; - - /* fill the old dummy TD */ - td = urb_priv->td [index] = urb_priv->ed->dummy; - urb_priv->ed->dummy = td_pt; - - td->ed = urb_priv->ed; - td->next_dl_td = NULL; - td->index = index; - td->urb = urb; - td->data_dma = data; - if (!len) - data = 0; - - td->hwINFO = cpu_to_le32 (info); - if (is_iso) { - td->hwCBP = cpu_to_le32 (data & 0xFFFFF000); - td->hwPSW [0] = cpu_to_le16 ((data & 0x0FFF) | 0xE000); - td->ed->last_iso = info & 0xffff; - } else { - td->hwCBP = cpu_to_le32 (data); - } - if (data) - td->hwBE = cpu_to_le32 (data + len - 1); - else - td->hwBE = 0; - td->hwNextTD = cpu_to_le32 (td_pt->td_dma); - - /* append to queue */ - list_add_tail (&td->td_list, &td->ed->td_list); - - /* hash it for later reverse mapping */ - hash = TD_HASH_FUNC (td->td_dma); - td->td_hash = ohci->td_hash [hash]; - ohci->td_hash [hash] = td; - - /* HC might read the TD (or cachelines) right away ... */ - wmb (); - td->ed->hwTailP = td->hwNextTD; -} - -/*-------------------------------------------------------------------------*/ - -/* Prepare all TDs of a transfer, and queue them onto the ED. - * Caller guarantees HC is active. - * Usually the ED is already on the schedule, so TDs might be - * processed as soon as they're queued. - */ -static void td_submit_urb ( - struct ohci_hcd *ohci, - struct urb *urb -) { - struct urb_priv *urb_priv = urb->hcpriv; - dma_addr_t data; - int data_len = urb->transfer_buffer_length; - int cnt = 0; - u32 info = 0; - int is_out = usb_pipeout (urb->pipe); - - /* OHCI handles the bulk/interrupt data toggles itself. We just - * use the device toggle bits for resetting, and rely on the fact - * that resetting toggle is meaningless if the endpoint is active. - */ - if (!usb_gettoggle (urb->dev, usb_pipeendpoint (urb->pipe), is_out)) { - usb_settoggle (urb->dev, usb_pipeendpoint (urb->pipe), - is_out, 1); - urb_priv->ed->hwHeadP &= ~ED_C; - } - - urb_priv->td_cnt = 0; - - if (data_len) - data = urb->transfer_dma; - else - data = 0; - - /* NOTE: TD_CC is set so we can tell which TDs the HC processed by - * using TD_CC_GET, as well as by seeing them on the done list. - * (CC = NotAccessed ... 0x0F, or 0x0E in PSWs for ISO.) - */ - switch (urb_priv->ed->type) { - - /* Bulk and interrupt are identical except for where in the schedule - * their EDs live. - */ - case PIPE_INTERRUPT: - /* ... and periodic urbs have extra accounting */ - hcd_to_bus (&ohci->hcd)->bandwidth_int_reqs++; - /* FALLTHROUGH */ - case PIPE_BULK: - info = is_out - ? TD_T_TOGGLE | TD_CC | TD_DP_OUT - : TD_T_TOGGLE | TD_CC | TD_DP_IN; - /* TDs _could_ transfer up to 8K each */ - while (data_len > 4096) { - td_fill (ohci, info, data, 4096, urb, cnt); - data += 4096; - data_len -= 4096; - cnt++; - } - /* maybe avoid ED halt on final TD short read */ - if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) - info |= TD_R; - td_fill (ohci, info, data, data_len, urb, cnt); - cnt++; - if ((urb->transfer_flags & URB_ZERO_PACKET) - && cnt < urb_priv->length) { - td_fill (ohci, info, 0, 0, urb, cnt); - cnt++; - } - /* maybe kickstart bulk list */ - if (urb_priv->ed->type == PIPE_BULK) { - wmb (); - writel (OHCI_BLF, &ohci->regs->cmdstatus); - } - break; - - /* control manages DATA0/DATA1 toggle per-request; SETUP resets it, - * any DATA phase works normally, and the STATUS ack is special. - */ - case PIPE_CONTROL: - info = TD_CC | TD_DP_SETUP | TD_T_DATA0; - td_fill (ohci, info, urb->setup_dma, 8, urb, cnt++); - if (data_len > 0) { - info = TD_CC | TD_R | TD_T_DATA1; - info |= is_out ? TD_DP_OUT : TD_DP_IN; - /* NOTE: mishandles transfers >8K, some >4K */ - td_fill (ohci, info, data, data_len, urb, cnt++); - } - info = is_out - ? TD_CC | TD_DP_IN | TD_T_DATA1 - : TD_CC | TD_DP_OUT | TD_T_DATA1; - td_fill (ohci, info, data, 0, urb, cnt++); - /* maybe kickstart control list */ - wmb (); - writel (OHCI_CLF, &ohci->regs->cmdstatus); - break; - - /* ISO has no retransmit, so no toggle; and it uses special TDs. - * Each TD could handle multiple consecutive frames (interval 1); - * we could often reduce the number of TDs here. - */ - case PIPE_ISOCHRONOUS: - for (cnt = 0; cnt < urb->number_of_packets; cnt++) { - int frame = urb->start_frame; - - // FIXME scheduling should handle frame counter - // roll-around ... exotic case (and OHCI has - // a 2^16 iso range, vs other HCs max of 2^10) - frame += cnt * urb->interval; - frame &= 0xffff; - td_fill (ohci, TD_CC | TD_ISO | frame, - data + urb->iso_frame_desc [cnt].offset, - urb->iso_frame_desc [cnt].length, urb, cnt); - } - hcd_to_bus (&ohci->hcd)->bandwidth_isoc_reqs++; - break; - } - // ASSERT (urb_priv->length == cnt); -} - -/*-------------------------------------------------------------------------* - * Done List handling functions - *-------------------------------------------------------------------------*/ - -/* calculate transfer length/status and update the urb - * PRECONDITION: irqsafe (only for urb->status locking) - */ -static void td_done (struct ohci_hcd *ohci, struct urb *urb, struct td *td) -{ - u32 tdINFO = le32_to_cpup (&td->hwINFO); - int cc = 0; - - list_del (&td->td_list); - - /* ISO ... drivers see per-TD length/status */ - if (tdINFO & TD_ISO) { - u16 tdPSW = le16_to_cpu (td->hwPSW [0]); - int dlen = 0; - - /* NOTE: assumes FC in tdINFO == 0 (and MAXPSW == 1) */ - - cc = (tdPSW >> 12) & 0xF; - if (tdINFO & TD_CC) /* hc didn't touch? */ - return; - - if (usb_pipeout (urb->pipe)) - dlen = urb->iso_frame_desc [td->index].length; - else { - /* short reads are always OK for ISO */ - if (cc == TD_DATAUNDERRUN) - cc = TD_CC_NOERROR; - dlen = tdPSW & 0x3ff; - } - urb->actual_length += dlen; - urb->iso_frame_desc [td->index].actual_length = dlen; - urb->iso_frame_desc [td->index].status = cc_to_error [cc]; - - if (cc != TD_CC_NOERROR) - ohci_vdbg (ohci, - "urb %p iso td %p (%d) len %d cc %d\n", - urb, td, 1 + td->index, dlen, cc); - - /* BULK, INT, CONTROL ... drivers see aggregate length/status, - * except that "setup" bytes aren't counted and "short" transfers - * might not be reported as errors. - */ - } else { - int type = usb_pipetype (urb->pipe); - u32 tdBE = le32_to_cpup (&td->hwBE); - - cc = TD_CC_GET (tdINFO); - - /* control endpoints only have soft stalls */ - if (type != PIPE_CONTROL && cc == TD_CC_STALL) - usb_endpoint_halt (urb->dev, - usb_pipeendpoint (urb->pipe), - usb_pipeout (urb->pipe)); - - /* update packet status if needed (short is normally ok) */ - if (cc == TD_DATAUNDERRUN - && !(urb->transfer_flags & URB_SHORT_NOT_OK)) - cc = TD_CC_NOERROR; - /* - Check for TD_DATAOVERRUN added by Carcharius - having this here allows devices in all 4 ports - on a 1.0 xbox - */ - if (cc != TD_CC_NOERROR && cc < 0x0E && cc != TD_DATAOVERRUN) { - spin_lock (&urb->lock); - if (urb->status == -EINPROGRESS) - urb->status = cc_to_error [cc]; - spin_unlock (&urb->lock); - } - - /* count all non-empty packets except control SETUP packet */ - if ((type != PIPE_CONTROL || td->index != 0) && tdBE != 0) { - if (td->hwCBP == 0) - urb->actual_length += tdBE - td->data_dma + 1; - else - urb->actual_length += - le32_to_cpup (&td->hwCBP) - - td->data_dma; - } - - if (cc != TD_CC_NOERROR && cc < 0x0E) - ohci_vdbg (ohci, - "urb %p td %p (%d) cc %d, len=%d/%d\n", - urb, td, 1 + td->index, cc, - urb->actual_length, - urb->transfer_buffer_length); - } -} - -/*-------------------------------------------------------------------------*/ - -static inline struct td * -ed_halted (struct ohci_hcd *ohci, struct td *td, int cc, struct td *rev) -{ - struct urb *urb = td->urb; - struct ed *ed = td->ed; - struct list_head *tmp = td->td_list.next; - u32 toggle = ed->hwHeadP & ED_C; - - /* clear ed halt; this is the td that caused it, but keep it inactive - * until its urb->complete() has a chance to clean up. - */ - ed->hwINFO |= ED_SKIP; - wmb (); - ed->hwHeadP &= ~ED_H; - - /* put any later tds from this urb onto the donelist, after 'td', - * order won't matter here: no errors, and nothing was transferred. - * also patch the ed so it looks as if those tds completed normally. - */ - while (tmp != &ed->td_list) { - struct td *next; - u32 info; - - next = list_entry (tmp, struct td, td_list); - tmp = next->td_list.next; - - if (next->urb != urb) - break; - - /* NOTE: if multi-td control DATA segments get supported, - * this urb had one of them, this td wasn't the last td - * in that segment (TD_R clear), this ed halted because - * of a short read, _and_ URB_SHORT_NOT_OK is clear ... - * then we need to leave the control STATUS packet queued - * and clear ED_SKIP. - */ - info = next->hwINFO; - info |= cpu_to_le32 (TD_DONE); - info &= ~cpu_to_le32 (TD_CC); - next->hwINFO = info; - - next->next_dl_td = rev; - rev = next; - - if (ed->hwTailP == cpu_to_le32 (next->td_dma)) - ed->hwTailP = next->hwNextTD; - ed->hwHeadP = next->hwNextTD | toggle; - } - - /* help for troubleshooting: report anything that - * looks odd ... that doesn't include protocol stalls - * (or maybe some other things) - */ - if (cc != TD_CC_STALL || !usb_pipecontrol (urb->pipe)) - ohci_dbg (ohci, - "urb %p path %s ep%d%s %08x cc %d --> status %d\n", - urb, urb->dev->devpath, - usb_pipeendpoint (urb->pipe), - usb_pipein (urb->pipe) ? "in" : "out", - le32_to_cpu (td->hwINFO), - cc, cc_to_error [cc]); - - return rev; -} - -/* replies to the request have to be on a FIFO basis so - * we unreverse the hc-reversed done-list - */ -static struct td *dl_reverse_done_list (struct ohci_hcd *ohci) -{ - u32 td_dma; - struct td *td_rev = NULL; - struct td *td = NULL; - unsigned long flags; - - spin_lock_irqsave (&ohci->lock, flags); - td_dma = le32_to_cpup (&ohci->hcca->done_head); - ohci->hcca->done_head = 0; - - /* get TD from hc's singly linked list, and - * prepend to ours. ed->td_list changes later. - */ - while (td_dma) { - int cc; - - td = dma_to_td (ohci, td_dma); - if (!td) { - ohci_err (ohci, "bad entry %8x\n", td_dma); - break; - } - - td->hwINFO |= cpu_to_le32 (TD_DONE); - cc = TD_CC_GET (le32_to_cpup (&td->hwINFO)); - - /* Non-iso endpoints can halt on error; un-halt, - * and dequeue any other TDs from this urb. - * No other TD could have caused the halt. - */ - if (cc != TD_CC_NOERROR && (td->ed->hwHeadP & ED_H)) - td_rev = ed_halted (ohci, td, cc, td_rev); - - td->next_dl_td = td_rev; - td_rev = td; - td_dma = le32_to_cpup (&td->hwNextTD); - } - spin_unlock_irqrestore (&ohci->lock, flags); - return td_rev; -} - -/*-------------------------------------------------------------------------*/ - -/* wrap-aware logic stolen from */ -#define tick_before(t1,t2) ((((s16)(t1))-((s16)(t2))) < 0) - -/* there are some urbs/eds to unlink; called in_irq(), with HCD locked */ -static void -finish_unlinks (struct ohci_hcd *ohci, u16 tick, struct pt_regs *regs) -{ - struct ed *ed, **last; - -rescan_all: - for (last = &ohci->ed_rm_list, ed = *last; ed != NULL; ed = *last) { - struct list_head *entry, *tmp; - int completed, modified; - u32 *prev; - - /* only take off EDs that the HC isn't using, accounting for - * frame counter wraps. - */ - if (tick_before (tick, ed->tick) && !ohci->disabled) { - last = &ed->ed_next; - continue; - } - - /* reentrancy: if we drop the schedule lock, someone might - * have modified this list. normally it's just prepending - * entries (which we'd ignore), but paranoia won't hurt. - */ - *last = ed->ed_next; - ed->ed_next = 0; - modified = 0; - - /* unlink urbs as requested, but rescan the list after - * we call a completion since it might have unlinked - * another (earlier) urb - */ -rescan_this: - completed = 0; - prev = &ed->hwHeadP; - list_for_each_safe (entry, tmp, &ed->td_list) { - struct td *td; - struct urb *urb; - urb_priv_t *urb_priv; - u32 savebits; - - td = list_entry (entry, struct td, td_list); - urb = td->urb; - urb_priv = td->urb->hcpriv; - - if (urb_priv->state != URB_DEL) { - prev = &td->hwNextTD; - continue; - } - - /* patch pointers hc uses ... tail, if we're removing - * an otherwise active td, and whatever td pointer - * points to this td - */ - if (ed->hwTailP == cpu_to_le32 (td->td_dma)) - ed->hwTailP = td->hwNextTD; - savebits = *prev & ~cpu_to_le32 (TD_MASK); - *prev = td->hwNextTD | savebits; - - /* HC may have partly processed this TD */ - td_done (ohci, urb, td); - urb_priv->td_cnt++; - - /* if URB is done, clean up */ - if (urb_priv->td_cnt == urb_priv->length) { - modified = completed = 1; - spin_unlock (&ohci->lock); - finish_urb (ohci, urb, regs); - spin_lock (&ohci->lock); - } - } - if (completed && !list_empty (&ed->td_list)) - goto rescan_this; - - /* ED's now officially unlinked, hc doesn't see */ - ed->state = ED_IDLE; - ed->hwINFO &= ~(ED_SKIP | ED_DEQUEUE); - ed->hwHeadP &= ~ED_H; - ed->hwNextED = 0; - - /* but if there's work queued, reschedule */ - if (!list_empty (&ed->td_list)) { - if (!ohci->disabled && !ohci->sleeping) - ed_schedule (ohci, ed); - } - - if (modified) - goto rescan_all; - } - - /* maybe reenable control and bulk lists */ - if (!ohci->disabled && !ohci->ed_rm_list) { - u32 command = 0, control = 0; - - if (ohci->ed_controltail) { - command |= OHCI_CLF; - if (!(ohci->hc_control & OHCI_CTRL_CLE)) { - control |= OHCI_CTRL_CLE; - writel (0, &ohci->regs->ed_controlcurrent); - } - } - if (ohci->ed_bulktail) { - command |= OHCI_BLF; - if (!(ohci->hc_control & OHCI_CTRL_BLE)) { - control |= OHCI_CTRL_BLE; - writel (0, &ohci->regs->ed_bulkcurrent); - } - } - - /* CLE/BLE to enable, CLF/BLF to (maybe) kickstart */ - if (control) { - ohci->hc_control |= control; - writel (ohci->hc_control, &ohci->regs->control); - } - if (command) - writel (command, &ohci->regs->cmdstatus); - } -} - - - -/*-------------------------------------------------------------------------*/ - -/* - * Process normal completions (error or success) and clean the schedules. - * - * This is the main path for handing urbs back to drivers. The only other - * path is finish_unlinks(), which unlinks URBs using ed_rm_list, instead of - * scanning the (re-reversed) donelist as this does. - */ -static void -dl_done_list (struct ohci_hcd *ohci, struct td *td, struct pt_regs *regs) -{ - unsigned long flags; - - spin_lock_irqsave (&ohci->lock, flags); - while (td) { - struct td *td_next = td->next_dl_td; - struct urb *urb = td->urb; - urb_priv_t *urb_priv = urb->hcpriv; - struct ed *ed = td->ed; - - /* update URB's length and status from TD */ - td_done (ohci, urb, td); - urb_priv->td_cnt++; - - /* If all this urb's TDs are done, call complete() */ - if (urb_priv->td_cnt == urb_priv->length) { - spin_unlock (&ohci->lock); - finish_urb (ohci, urb, regs); - spin_lock (&ohci->lock); - } - - /* clean schedule: unlink EDs that are no longer busy */ - if (list_empty (&ed->td_list)) - ed_deschedule (ohci, ed); - /* ... reenabling halted EDs only after fault cleanup */ - else if (!(ed->hwINFO & ED_DEQUEUE)) { - td = list_entry (ed->td_list.next, struct td, td_list); - if (!(td->hwINFO & TD_DONE)) - ed->hwINFO &= ~ED_SKIP; - } - - td = td_next; - } - spin_unlock_irqrestore (&ohci->lock, flags); -} diff --git a/lib/usb/host/ohci.h b/lib/usb/host/ohci.h deleted file mode 100644 index a9c564b98..000000000 --- a/lib/usb/host/ohci.h +++ /dev/null @@ -1,406 +0,0 @@ -/* - * OHCI HCD (Host Controller Driver) for USB. - * - * (C) Copyright 1999 Roman Weissgaerber - * (C) Copyright 2000-2002 David Brownell - * - * This file is licenced under the GPL. - */ - -/* - * OHCI Endpoint Descriptor (ED) ... holds TD queue - * See OHCI spec, section 4.2 - * - * This is a "Queue Head" for those transfers, which is why - * both EHCI and UHCI call similar structures a "QH". - */ -struct ed { - /* first fields are hardware-specified, le32 */ - __u32 hwINFO; /* endpoint config bitmap */ - /* info bits defined by hcd */ -#define ED_DEQUEUE __constant_cpu_to_le32(1 << 27) - /* info bits defined by the hardware */ -#define ED_ISO __constant_cpu_to_le32(1 << 15) -#define ED_SKIP __constant_cpu_to_le32(1 << 14) -#define ED_LOWSPEED __constant_cpu_to_le32(1 << 13) -#define ED_OUT __constant_cpu_to_le32(0x01 << 11) -#define ED_IN __constant_cpu_to_le32(0x02 << 11) - __u32 hwTailP; /* tail of TD list */ - __u32 hwHeadP; /* head of TD list (hc r/w) */ -#define ED_C __constant_cpu_to_le32(0x02) /* toggle carry */ -#define ED_H __constant_cpu_to_le32(0x01) /* halted */ - __u32 hwNextED; /* next ED in list */ - - /* rest are purely for the driver's use */ - dma_addr_t dma; /* addr of ED */ - struct td *dummy; /* next TD to activate */ - - /* host's view of schedule */ - struct ed *ed_next; /* on schedule or rm_list */ - struct ed *ed_prev; /* for non-interrupt EDs */ - struct list_head td_list; /* "shadow list" of our TDs */ - - /* create --> IDLE --> OPER --> ... --> IDLE --> destroy - * usually: OPER --> UNLINK --> (IDLE | OPER) --> ... - * some special cases : OPER --> IDLE ... - */ - u8 state; /* ED_{IDLE,UNLINK,OPER} */ -#define ED_IDLE 0x00 /* NOT linked to HC */ -#define ED_UNLINK 0x01 /* being unlinked from hc */ -#define ED_OPER 0x02 /* IS linked to hc */ - - u8 type; /* PIPE_{BULK,...} */ - - /* periodic scheduling params (for intr and iso) */ - u8 branch; - u16 interval; - u16 load; - u16 last_iso; /* iso only */ - - /* HC may see EDs on rm_list until next frame (frame_no == tick) */ - u16 tick; -} __attribute__ ((aligned(16))); - -#define ED_MASK ((u32)~0x0f) /* strip hw status in low addr bits */ - - -/* - * OHCI Transfer Descriptor (TD) ... one per transfer segment - * See OHCI spec, sections 4.3.1 (general = control/bulk/interrupt) - * and 4.3.2 (iso) - */ -struct td { - /* first fields are hardware-specified, le32 */ - __u32 hwINFO; /* transfer info bitmask */ - - /* hwINFO bits for both general and iso tds: */ -#define TD_CC 0xf0000000 /* condition code */ -#define TD_CC_GET(td_p) ((td_p >>28) & 0x0f) -//#define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28) -#define TD_DI 0x00E00000 /* frames before interrupt */ -#define TD_DI_SET(X) (((X) & 0x07)<< 21) - /* these two bits are available for definition/use by HCDs in both - * general and iso tds ... others are available for only one type - */ -#define TD_DONE 0x00020000 /* retired to donelist */ -#define TD_ISO 0x00010000 /* copy of ED_ISO */ - - /* hwINFO bits for general tds: */ -#define TD_EC 0x0C000000 /* error count */ -#define TD_T 0x03000000 /* data toggle state */ -#define TD_T_DATA0 0x02000000 /* DATA0 */ -#define TD_T_DATA1 0x03000000 /* DATA1 */ -#define TD_T_TOGGLE 0x00000000 /* uses ED_C */ -#define TD_DP 0x00180000 /* direction/pid */ -#define TD_DP_SETUP 0x00000000 /* SETUP pid */ -#define TD_DP_IN 0x00100000 /* IN pid */ -#define TD_DP_OUT 0x00080000 /* OUT pid */ - /* 0x00180000 rsvd */ -#define TD_R 0x00040000 /* round: short packets OK? */ - - /* (no hwINFO #defines yet for iso tds) */ - - __u32 hwCBP; /* Current Buffer Pointer (or 0) */ - __u32 hwNextTD; /* Next TD Pointer */ - __u32 hwBE; /* Memory Buffer End Pointer */ - - /* PSW is only for ISO */ -#define MAXPSW 1 /* hardware allows 8 */ - __u16 hwPSW [MAXPSW]; - - /* rest are purely for the driver's use */ - __u8 index; - struct ed *ed; - struct td *td_hash; /* dma-->td hashtable */ - struct td *next_dl_td; - struct urb *urb; - - dma_addr_t td_dma; /* addr of this TD */ - dma_addr_t data_dma; /* addr of data it points to */ - - struct list_head td_list; /* "shadow list", TDs on same ED */ -} __attribute__ ((aligned(32))); /* c/b/i need 16; only iso needs 32 */ - -#define TD_MASK ((u32)~0x1f) /* strip hw status in low addr bits */ - -/* - * Hardware transfer status codes -- CC from td->hwINFO or td->hwPSW - */ -#define TD_CC_NOERROR 0x00 -#define TD_CC_CRC 0x01 -#define TD_CC_BITSTUFFING 0x02 -#define TD_CC_DATATOGGLEM 0x03 -#define TD_CC_STALL 0x04 -#define TD_DEVNOTRESP 0x05 -#define TD_PIDCHECKFAIL 0x06 -#define TD_UNEXPECTEDPID 0x07 -#define TD_DATAOVERRUN 0x08 -#define TD_DATAUNDERRUN 0x09 - /* 0x0A, 0x0B reserved for hardware */ -#define TD_BUFFEROVERRUN 0x0C -#define TD_BUFFERUNDERRUN 0x0D - /* 0x0E, 0x0F reserved for HCD */ -#define TD_NOTACCESSED 0x0F - - -/* map OHCI TD status codes (CC) to errno values */ -static const int cc_to_error [16] = { - /* No Error */ 0, - /* CRC Error */ -EILSEQ, - /* Bit Stuff */ -EPROTO, - /* Data Togg */ -EILSEQ, - /* Stall */ -EPIPE, - /* DevNotResp */ -ETIMEDOUT, - /* PIDCheck */ -EPROTO, - /* UnExpPID */ -EPROTO, - /* DataOver */ -EOVERFLOW, - /* DataUnder */ -EREMOTEIO, - /* (for hw) */ -EIO, - /* (for hw) */ -EIO, - /* BufferOver */ -ECOMM, - /* BuffUnder */ -ENOSR, - /* (for HCD) */ -EALREADY, - /* (for HCD) */ -EALREADY -}; - - -/* - * The HCCA (Host Controller Communications Area) is a 256 byte - * structure defined section 4.4.1 of the OHCI spec. The HC is - * told the base address of it. It must be 256-byte aligned. - */ -struct ohci_hcca { -#define NUM_INTS 32 - __u32 int_table [NUM_INTS]; /* periodic schedule */ - __u16 frame_no; /* current frame number */ - __u16 pad1; /* set to 0 on each frame_no change */ - __u32 done_head; /* info returned for an interrupt */ - u8 reserved_for_hc [116]; - u8 what [4]; /* spec only identifies 252 bytes :) */ -} __attribute__ ((aligned(256))); - - -/* - * This is the structure of the OHCI controller's memory mapped I/O region. - * You must use readl() and writel() (in ) to access these fields!! - * Layout is in section 7 (and appendix B) of the spec. - */ -struct ohci_regs { - /* control and status registers (section 7.1) */ - __u32 revision; - __u32 control; - __u32 cmdstatus; - __u32 intrstatus; - __u32 intrenable; - __u32 intrdisable; - - /* memory pointers (section 7.2) */ - __u32 hcca; - __u32 ed_periodcurrent; - __u32 ed_controlhead; - __u32 ed_controlcurrent; - __u32 ed_bulkhead; - __u32 ed_bulkcurrent; - __u32 donehead; - - /* frame counters (section 7.3) */ - __u32 fminterval; - __u32 fmremaining; - __u32 fmnumber; - __u32 periodicstart; - __u32 lsthresh; - - /* Root hub ports (section 7.4) */ - struct ohci_roothub_regs { - __u32 a; - __u32 b; - __u32 status; -#define MAX_ROOT_PORTS 15 /* maximum OHCI root hub ports (RH_A_NDP) */ - __u32 portstatus [MAX_ROOT_PORTS]; - } roothub; - - /* and optional "legacy support" registers (appendix B) at 0x0100 */ - -} __attribute__ ((aligned(32))); - - -/* OHCI CONTROL AND STATUS REGISTER MASKS */ - -/* - * HcControl (control) register masks - */ -#define OHCI_CTRL_CBSR (3 << 0) /* control/bulk service ratio */ -#define OHCI_CTRL_PLE (1 << 2) /* periodic list enable */ -#define OHCI_CTRL_IE (1 << 3) /* isochronous enable */ -#define OHCI_CTRL_CLE (1 << 4) /* control list enable */ -#define OHCI_CTRL_BLE (1 << 5) /* bulk list enable */ -#define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */ -#define OHCI_CTRL_IR (1 << 8) /* interrupt routing */ -#define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */ -#define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */ - -/* pre-shifted values for HCFS */ -# define OHCI_USB_RESET (0 << 6) -# define OHCI_USB_RESUME (1 << 6) -# define OHCI_USB_OPER (2 << 6) -# define OHCI_USB_SUSPEND (3 << 6) - -/* - * HcCommandStatus (cmdstatus) register masks - */ -#define OHCI_HCR (1 << 0) /* host controller reset */ -#define OHCI_CLF (1 << 1) /* control list filled */ -#define OHCI_BLF (1 << 2) /* bulk list filled */ -#define OHCI_OCR (1 << 3) /* ownership change request */ -#define OHCI_SOC (3 << 16) /* scheduling overrun count */ - -/* - * masks used with interrupt registers: - * HcInterruptStatus (intrstatus) - * HcInterruptEnable (intrenable) - * HcInterruptDisable (intrdisable) - */ -#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */ -#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */ -#define OHCI_INTR_SF (1 << 2) /* start frame */ -#define OHCI_INTR_RD (1 << 3) /* resume detect */ -#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */ -#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */ -#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */ -#define OHCI_INTR_OC (1 << 30) /* ownership change */ -#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */ - - -/* OHCI ROOT HUB REGISTER MASKS */ - -/* roothub.portstatus [i] bits */ -#define RH_PS_CCS 0x00000001 /* current connect status */ -#define RH_PS_PES 0x00000002 /* port enable status*/ -#define RH_PS_PSS 0x00000004 /* port suspend status */ -#define RH_PS_POCI 0x00000008 /* port over current indicator */ -#define RH_PS_PRS 0x00000010 /* port reset status */ -#define RH_PS_PPS 0x00000100 /* port power status */ -#define RH_PS_LSDA 0x00000200 /* low speed device attached */ -#define RH_PS_CSC 0x00010000 /* connect status change */ -#define RH_PS_PESC 0x00020000 /* port enable status change */ -#define RH_PS_PSSC 0x00040000 /* port suspend status change */ -#define RH_PS_OCIC 0x00080000 /* over current indicator change */ -#define RH_PS_PRSC 0x00100000 /* port reset status change */ - -/* roothub.status bits */ -#define RH_HS_LPS 0x00000001 /* local power status */ -#define RH_HS_OCI 0x00000002 /* over current indicator */ -#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */ -#define RH_HS_LPSC 0x00010000 /* local power status change */ -#define RH_HS_OCIC 0x00020000 /* over current indicator change */ -#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */ - -/* roothub.b masks */ -#define RH_B_DR 0x0000ffff /* device removable flags */ -#define RH_B_PPCM 0xffff0000 /* port power control mask */ - -/* roothub.a masks */ -#define RH_A_NDP (0xff << 0) /* number of downstream ports */ -#define RH_A_PSM (1 << 8) /* power switching mode */ -#define RH_A_NPS (1 << 9) /* no power switching */ -#define RH_A_DT (1 << 10) /* device type (mbz) */ -#define RH_A_OCPM (1 << 11) /* over current protection mode */ -#define RH_A_NOCP (1 << 12) /* no over current protection */ -#define RH_A_POTPGT (0xff << 24) /* power on to power good time */ - - -/* hcd-private per-urb state */ -typedef struct urb_priv { - struct ed *ed; - __u16 length; // # tds in this request - __u16 td_cnt; // tds already serviced - int state; - struct td *td [0]; // all TDs in this request - -} urb_priv_t; - -#define URB_DEL 1 - -#define TD_HASH_SIZE 64 /* power'o'two */ -// sizeof (struct td) ~= 64 == 2^6 ... -#define TD_HASH_FUNC(td_dma) ((td_dma ^ (td_dma >> 6)) % TD_HASH_SIZE) - - -/* - * This is the full ohci controller description - * - * Note how the "proper" USB information is just - * a subset of what the full implementation needs. (Linus) - */ - -struct ohci_hcd { - spinlock_t lock; - - /* - * I/O memory used to communicate with the HC (dma-consistent) - */ - struct ohci_regs *regs; - - /* - * main memory used to communicate with the HC (dma-consistent). - * hcd adds to schedule for a live hc any time, but removals finish - * only at the start of the next frame. - */ - struct ohci_hcca *hcca; - dma_addr_t hcca_dma; - - struct ed *ed_rm_list; /* to be removed */ - - struct ed *ed_bulktail; /* last in bulk list */ - struct ed *ed_controltail; /* last in ctrl list */ - struct ed *periodic [NUM_INTS]; /* shadow int_table */ - - /* - * memory management for queue data structures - */ - struct pci_pool *td_cache; - struct pci_pool *ed_cache; - struct td *td_hash [TD_HASH_SIZE]; - - /* - * driver state - */ - int disabled; /* e.g. got a UE, we're hung */ - int sleeping; - int load [NUM_INTS]; - u32 hc_control; /* copy of hc control reg */ - - unsigned long flags; /* for HC bugs */ -#define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */ -#define OHCI_QUIRK_SUPERIO 0x02 /* natsemi */ - // there are also chip quirks/bugs in init logic - - /* - * framework state - */ - struct usb_hcd hcd; -}; - -#define hcd_to_ohci(hcd_ptr) container_of(hcd_ptr, struct ohci_hcd, hcd) - -/*-------------------------------------------------------------------------*/ - -#ifndef DEBUG -#define STUB_DEBUG_FILES -#endif /* DEBUG */ - -#define ohci_dbg(ohci, fmt, args...) \ - dev_dbg ((ohci)->hcd.controller , fmt , ## args ) -#define ohci_err(ohci, fmt, args...) \ - dev_err ((ohci)->hcd.controller , fmt , ## args ) -#define ohci_info(ohci, fmt, args...) \ - dev_info ((ohci)->hcd.controller , fmt , ## args ) -#define ohci_warn(ohci, fmt, args...) \ - dev_warn ((ohci)->hcd.controller , fmt , ## args ) - -#ifdef OHCI_VERBOSE_DEBUG -# define ohci_vdbg ohci_dbg -#else -# define ohci_vdbg(ohci, fmt, args...) do { } while (0) -#endif - diff --git a/lib/usb/host/ohci_config.h b/lib/usb/host/ohci_config.h deleted file mode 100644 index 01fd7cdcb..000000000 --- a/lib/usb/host/ohci_config.h +++ /dev/null @@ -1,5 +0,0 @@ -/* - * Configs for OHCI - */ - -#define CONFIG_PCI diff --git a/lib/usb/hub.h b/lib/usb/hub.h deleted file mode 100644 index 9476f395b..000000000 --- a/lib/usb/hub.h +++ /dev/null @@ -1,407 +0,0 @@ -/******************************************************************************/ -/* */ -/* File: hub.h */ -/* bkenwright@xbdev.net - www.xbdev.net */ -/* */ -/******************************************************************************/ - -#ifndef __HUB__ -#define __HUB__ - -#include - - - -/******************************************************************************/ -/* USB CONSTANTS */ -/******************************************************************************/ - -/* - * Device and/or Interface Class codes - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_DATA 10 -#define USB_CLASS_VENDOR_SPEC 0xff - -/* - * Descriptor types - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 - -#define USB_DT_HUB 0x29 -#define USB_DT_HID 0x21 -#define USB_DT_REPORT 0x22 -#define USB_DT_PHYSICAL 0x23 - -/* - * Descriptor sizes per descriptor type - */ -#define USB_DT_DEVICE_SIZE 18 -#define USB_DT_CONFIG_SIZE 9 -#define USB_DT_INTERFACE_SIZE 9 -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ -#define USB_DT_HUB_NONVAR_SIZE 7 - -/* - * USB Request Type and Endpoint Directions - */ -#define USB_DIR_OUT 0 -#define USB_DIR_IN 0x80 - -#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 - -/* - * USB Packet IDs (PIDs) - */ -#define USB_PID_OUT 0xe1 -#define USB_PID_IN 0x69 -#define USB_PID_SETUP 0x2d - -/* - * Standard requests - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -/* 0x02 is reserved */ -#define USB_REQ_SET_FEATURE 0x03 -/* 0x04 is reserved */ -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -/* - * HIDD requests - */ -#define USB_REQ_GET_REPORT 0x01 -#define USB_REQ_GET_IDLE 0x02 -#define USB_REQ_GET_PROTOCOL 0x03 -#define USB_REQ_SET_REPORT 0x09 -#define USB_REQ_SET_IDLE 0x0A -#define USB_REQ_SET_PROTOCOL 0x0B - -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -#define USB_HID_RPT_INPUT 0x01 -#define USB_HID_RPT_OUTPUT 0x02 -#define USB_HID_RPT_FEATURE 0x03 - -/* - * Request target types. - */ -#define USB_RT_DEVICE 0x00 -#define USB_RT_INTERFACE 0x01 -#define USB_RT_ENDPOINT 0x02 - -#define USB_RT_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE) -#define USB_RT_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER) - -#define USB_RT_HIDD (USB_TYPE_CLASS | USB_RECIP_INTERFACE) - - -/******************************************************************************/ -/* HUB CONTANTS */ -/******************************************************************************/ - - - - -/* - * Hub Class feature numbers - */ -#define C_HUB_LOCAL_POWER 0 -#define C_HUB_OVER_CURRENT 1 - -/* - * Port feature numbers - */ -#define USB_PORT_FEAT_CONNECTION 0 -#define USB_PORT_FEAT_ENABLE 1 -#define USB_PORT_FEAT_SUSPEND 2 -#define USB_PORT_FEAT_OVER_CURRENT 3 -#define USB_PORT_FEAT_RESET 4 -#define USB_PORT_FEAT_POWER 8 -#define USB_PORT_FEAT_LOWSPEED 9 -#define USB_PORT_FEAT_C_CONNECTION 16 -#define USB_PORT_FEAT_C_ENABLE 17 -#define USB_PORT_FEAT_C_SUSPEND 18 -#define USB_PORT_FEAT_C_OVER_CURRENT 19 -#define USB_PORT_FEAT_C_RESET 20 - - -#pragma pack( push, 1 ) -typedef struct -{ - __u16 wPortStatus; - __u16 wPortChange; -} usb_port_status; -#pragma pack( pop ) - - -/* wPortStatus bits */ -#define USB_PORT_STAT_CONNECTION 0x0001 -#define USB_PORT_STAT_ENABLE 0x0002 -#define USB_PORT_STAT_SUSPEND 0x0004 -#define USB_PORT_STAT_OVERCURRENT 0x0008 -#define USB_PORT_STAT_RESET 0x0010 -#define USB_PORT_STAT_POWER 0x0100 -#define USB_PORT_STAT_LOW_SPEED 0x0200 - -/* wPortChange bits */ -#define USB_PORT_STAT_C_CONNECTION 0x0001 -#define USB_PORT_STAT_C_ENABLE 0x0002 -#define USB_PORT_STAT_C_SUSPEND 0x0004 -#define USB_PORT_STAT_C_OVERCURRENT 0x0008 -#define USB_PORT_STAT_C_RESET 0x0010 - -/* wHubCharacteristics (masks) */ -#define HUB_CHAR_LPSM 0x0003 -#define HUB_CHAR_COMPOUND 0x0004 -#define HUB_CHAR_OCPM 0x0018 - -#pragma pack( push, 1 ) -typedef struct -{ - __u16 wHubStatus; - __u16 wHubChange; -} usb_hub_status ; -#pragma pack( pop ) - -/* - *Hub Status & Hub Change bit masks - */ -#define HUB_STATUS_LOCAL_POWER 0x0001 -#define HUB_STATUS_OVERCURRENT 0x0002 - -#define HUB_CHANGE_LOCAL_POWER 0x0001 -#define HUB_CHANGE_OVERCURRENT 0x0002 - -/* Hub descriptor */ -#pragma pack( push, 1 ) -typedef struct -{ - __u8 bLength; - __u8 bDescriptorType; - __u8 bNbrPorts; - __u16 wHubCharacteristics; - __u8 bPwrOn2PwrGood; - __u8 bHubContrCurrent; - __u8 DeviceRemovable; - __u8 PortPowerCtrlMask; -} usb_hub_descriptor ; -#pragma pack( pop ) - -/* -struct usb_hub_descriptor_t -{ - __u8 bDescLength; - __u8 bDescriptorType; - __u8 bNbrPorts; - __u16 wHubCharacteristics; - #define UHD_PWR 0x0003 - #define UHD_PWR_GANGED 0x0000 - #define UHD_PWR_INDIVIDUAL 0x0001 - #define UHD_PWR_NO_SWITCH 0x0002 - #define UHD_COMPOUND 0x0004 - #define UHD_OC 0x0018 - #define UHD_OC_GLOBAL 0x0000 - #define UHD_OC_INDIVIDUAL 0x0008 - #define UHD_OC_NONE 0x0010 - #define UHD_TT_THINK 0x0060 - #define UHD_TT_THINK_8 0x0000 - #define UHD_TT_THINK_16 0x0020 - #define UHD_TT_THINK_24 0x0040 - #define UHD_TT_THINK_32 0x0060 - #define UHD_PORT_IND 0x0080 - - __u8 bPwrOn2PwrGood; // delay in 2 ms units - #define UHD_PWRON_FACTOR 2 - - __u8 bHubContrCurrent; - __u8 DeviceRemovable[32]; //max 255 ports - - #define UHD_NOT_REMOV(desc, i) \ - (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) - __u8 PortPowerCtrlMask[1]; // deprecated - }; -*/ -#define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */ - - -/******************************************************************************/ -/******************************************************************************/ -/******************************************************************************/ - -int get_control_msg(ohci_t * ohci, - __u8 Addr, - __u8 request, // 0x06 - __u8 requesttype, // 0x80 - __u16 value, - __u16 index, - __u16 size, - __u8 * data ); - - - - -int set_control_msg(ohci_t * ohci, - __u8 Addr, - __u8 request, - __u8 requesttype, - __u16 value, - __u16 index, - __u16 size, - __u8 * data ); - - - -//int usb_get_device_descriptor(ohci_t * ohci, __u8 Addr, int size, void *buf); - - -//int usb_get_hub_descriptor(ohci_t * ohci, __u8 Addr, int size, void *buf); - - - - -int usb_set_configuration(ohci_t * ohci, __u8 Addr, int configuration); - - -void DebugHubDescriptor( usb_hub_descriptor * pDes ); - - - -/***********************************************************************************/ - - -#define UT_WRITE 0x00 -#define UT_READ 0x80 -#define UT_STANDARD 0x00 -#define UT_CLASS 0x20 -#define UT_VENDOR 0x40 -#define UT_DEVICE 0x00 -#define UT_INTERFACE 0x01 -#define UT_ENDPOINT 0x02 -#define UT_OTHER 0x03 - -#define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) -#define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) -#define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) -#define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) -#define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) -#define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) -#define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) -#define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) -#define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) -#define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) -#define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) -#define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) -#define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) -#define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) -#define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) -#define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) -#define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) -#define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) -#define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) -#define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) -#define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) -#define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) - -/* Requests */ -#define UR_GET_STATUS 0x00 -#define UR_CLEAR_FEATURE 0x01 -#define UR_SET_FEATURE 0x03 -#define UR_SET_ADDRESS 0x05 -#define UR_GET_DESCRIPTOR 0x06 -#define UDESC_DEVICE 0x01 -#define UDESC_CONFIG 0x02 -#define UDESC_STRING 0x03 -#define UDESC_INTERFACE 0x04 -#define UDESC_ENDPOINT 0x05 -#define UDESC_DEVICE_QUALIFIER 0x06 -#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 -#define UDESC_INTERFACE_POWER 0x08 -#define UDESC_OTG 0x09 -#define UDESC_CS_DEVICE 0x21 /* class specific */ -#define UDESC_CS_CONFIG 0x22 -#define UDESC_CS_STRING 0x23 -#define UDESC_CS_INTERFACE 0x24 -#define UDESC_CS_ENDPOINT 0x25 -#define UDESC_HUB 0x29 -#define UR_SET_DESCRIPTOR 0x07 -#define UR_GET_CONFIG 0x08 -#define UR_SET_CONFIG 0x09 -#define UR_GET_INTERFACE 0x0a -#define UR_SET_INTERFACE 0x0b -#define UR_SYNCH_FRAME 0x0c - - - -/***********************************************************************************/ - -typedef struct -{ - unsigned char requesttype; // 1 byte - unsigned char request; // 1 byte - unsigned short value; // 2 bytes - unsigned short index; // 2 bytes - unsigned short length; // 2 bytes -} devrequest;// end devrequest // Total = 8 bytes - - -typedef struct -{ - ohci_t * p_ohci; /* our ohci stuff */ - __u8 address; /* device addess */ -}usbd_device;// end usbd_device - - - -int usbd_get_desc(usbd_device * dev, int type, int index, int len, void *desc); - -int usbd_do_request(usbd_device * dev, devrequest *req, void *data); - - -int usbd_get_hub_descriptor(usbd_device * dev, void * data); - - -int do_hub_work(usbd_device * dev); - - -int usbd_do_request_big_packet(usbd_device * dev, devrequest *req, void *data); - - - - -#endif // __HUB__ - - diff --git a/lib/usb/include/asm/bitops.h b/lib/usb/include/asm/bitops.h deleted file mode 100644 index cb6f76a2b..000000000 --- a/lib/usb/include/asm/bitops.h +++ /dev/null @@ -1,384 +0,0 @@ -#ifndef _I386_BITOPS_H -#define _I386_BITOPS_H - -/* - * Copyright 1992, Linus Torvalds. - */ - -// #include - -/* - * These have to be done with inline assembly: that way the bit-setting - * is guaranteed to be atomic. All bit operations return 0 if the bit - * was cleared before the operation and != 0 if it was not. - * - * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). - */ - -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - -#define ADDR (*(volatile long *) addr) - -/** - * set_bit - Atomically set a bit in memory - * @nr: the bit to set - * @addr: the address to start counting from - * - * This function is atomic and may not be reordered. See __set_bit() - * if you do not require the atomic guarantees. - * Note that @nr may be almost arbitrarily large; this function is not - * restricted to acting on a single-word quantity. - */ -static __inline__ void set_bit(int nr, volatile void * addr) -{ - __asm__ __volatile__( LOCK_PREFIX - "btsl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -} - -/** - * __set_bit - Set a bit in memory - * @nr: the bit to set - * @addr: the address to start counting from - * - * Unlike set_bit(), this function is non-atomic and may be reordered. - * If it's called on the same region of memory simultaneously, the effect - * may be that only one operation succeeds. - */ -static __inline__ void __set_bit(int nr, volatile void * addr) -{ - __asm__( - "btsl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -} - -/** - * clear_bit - Clears a bit in memory - * @nr: Bit to clear - * @addr: Address to start counting from - * - * clear_bit() is atomic and may not be reordered. However, it does - * not contain a memory barrier, so if it is used for locking purposes, - * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() - * in order to ensure changes are visible on other processors. - */ -static __inline__ void clear_bit(int nr, volatile void * addr) -{ - __asm__ __volatile__( LOCK_PREFIX - "btrl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -} -#define smp_mb__before_clear_bit() barrier() -#define smp_mb__after_clear_bit() barrier() - -/** - * __change_bit - Toggle a bit in memory - * @nr: the bit to set - * @addr: the address to start counting from - * - * Unlike change_bit(), this function is non-atomic and may be reordered. - * If it's called on the same region of memory simultaneously, the effect - * may be that only one operation succeeds. - */ -static __inline__ void __change_bit(int nr, volatile void * addr) -{ - __asm__ __volatile__( - "btcl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -} - -/** - * change_bit - Toggle a bit in memory - * @nr: Bit to clear - * @addr: Address to start counting from - * - * change_bit() is atomic and may not be reordered. - * Note that @nr may be almost arbitrarily large; this function is not - * restricted to acting on a single-word quantity. - */ -static __inline__ void change_bit(int nr, volatile void * addr) -{ - __asm__ __volatile__( LOCK_PREFIX - "btcl %1,%0" - :"=m" (ADDR) - :"Ir" (nr)); -} - -/** - * test_and_set_bit - Set a bit and return its old value - * @nr: Bit to set - * @addr: Address to count from - * - * This operation is atomic and cannot be reordered. - * It also implies a memory barrier. - */ -static __inline__ int test_and_set_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__ __volatile__( LOCK_PREFIX - "btsl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); - return oldbit; -} - -/** - * __test_and_set_bit - Set a bit and return its old value - * @nr: Bit to set - * @addr: Address to count from - * - * This operation is non-atomic and can be reordered. - * If two examples of this operation race, one can appear to succeed - * but actually fail. You must protect multiple accesses with a lock. - */ -static __inline__ int __test_and_set_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__( - "btsl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr)); - return oldbit; -} - -/** - * test_and_clear_bit - Clear a bit and return its old value - * @nr: Bit to set - * @addr: Address to count from - * - * This operation is atomic and cannot be reordered. - * It also implies a memory barrier. - */ -static __inline__ int test_and_clear_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__ __volatile__( LOCK_PREFIX - "btrl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); - return oldbit; -} - -/** - * __test_and_clear_bit - Clear a bit and return its old value - * @nr: Bit to set - * @addr: Address to count from - * - * This operation is non-atomic and can be reordered. - * If two examples of this operation race, one can appear to succeed - * but actually fail. You must protect multiple accesses with a lock. - */ -static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__( - "btrl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr)); - return oldbit; -} - -/* WARNING: non atomic and it can be reordered! */ -static __inline__ int __test_and_change_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__ __volatile__( - "btcl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); - return oldbit; -} - -/** - * test_and_change_bit - Change a bit and return its new value - * @nr: Bit to set - * @addr: Address to count from - * - * This operation is atomic and cannot be reordered. - * It also implies a memory barrier. - */ -static __inline__ int test_and_change_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__ __volatile__( LOCK_PREFIX - "btcl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"Ir" (nr) : "memory"); - return oldbit; -} - -#if 0 /* Fool kernel-doc since it doesn't do macros yet */ -/** - * test_bit - Determine whether a bit is set - * @nr: bit number to test - * @addr: Address to start counting from - */ -static int test_bit(int nr, const volatile void * addr); -#endif - -static __inline__ int constant_test_bit(int nr, const volatile void * addr) -{ - return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; -} - -static __inline__ int variable_test_bit(int nr, volatile void * addr) -{ - int oldbit; - - __asm__ __volatile__( - "btl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit) - :"m" (ADDR),"Ir" (nr)); - return oldbit; -} - -#define test_bit(nr,addr) \ -(__builtin_constant_p(nr) ? \ - constant_test_bit((nr),(addr)) : \ - variable_test_bit((nr),(addr))) - -/** - * find_first_zero_bit - find the first zero bit in a memory region - * @addr: The address to start the search at - * @size: The maximum size to search - * - * Returns the bit-number of the first zero bit, not the number of the byte - * containing a bit. - */ -static __inline__ int find_first_zero_bit(void * addr, unsigned size) -{ - int d0, d1, d2; - int res; - - if (!size) - return 0; - /* This looks at memory. Mark it volatile to tell gcc not to move it around */ - __asm__ __volatile__( - "movl $-1,%%eax\n\t" - "xorl %%edx,%%edx\n\t" - "repe; scasl\n\t" - "je 1f\n\t" - "xorl -4(%%edi),%%eax\n\t" - "subl $4,%%edi\n\t" - "bsfl %%eax,%%edx\n" - "1:\tsubl %%ebx,%%edi\n\t" - "shll $3,%%edi\n\t" - "addl %%edi,%%edx" - :"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2) - :"1" ((size + 31) >> 5), "2" (addr), "b" (addr)); - return res; -} - -/** - * find_next_zero_bit - find the first zero bit in a memory region - * @addr: The address to base the search on - * @offset: The bitnumber to start searching at - * @size: The maximum size to search - */ -static __inline__ int find_next_zero_bit (void * addr, int size, int offset) -{ - unsigned long * p = ((unsigned long *) addr) + (offset >> 5); - int set = 0, bit = offset & 31, res; - - if (bit) { - /* - * Look for zero in first byte - */ - __asm__("bsfl %1,%0\n\t" - "jne 1f\n\t" - "movl $32, %0\n" - "1:" - : "=r" (set) - : "r" (~(*p >> bit))); - if (set < (32 - bit)) - return set + offset; - set = 32 - bit; - p++; - } - /* - * No zero yet, search remaining full bytes for a zero - */ - res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr)); - return (offset + set + res); -} - -/** - * ffz - find first zero in word. - * @word: The word to search - * - * Undefined if no zero exists, so code should check against ~0UL first. - */ -static __inline__ unsigned long ffz(unsigned long word) -{ - __asm__("bsfl %1,%0" - :"=r" (word) - :"r" (~word)); - return word; -} - -#ifdef __KERNEL__ - -/** - * ffs - find first bit set - * @x: the word to search - * - * This is defined the same way as - * the libc and compiler builtin ffs routines, therefore - * differs in spirit from the above ffz (man ffs). - */ -static __inline__ int ffs(int x) -{ - int r; - - __asm__("bsfl %1,%0\n\t" - "jnz 1f\n\t" - "movl $-1,%0\n" - "1:" : "=r" (r) : "rm" (x)); - return r+1; -} - -/** - * hweightN - returns the hamming weight of a N-bit word - * @x: the word to weigh - * - * The Hamming Weight of a number is the total number of bits set in it. - */ - -#define hweight32(x) generic_hweight32(x) -#define hweight16(x) generic_hweight16(x) -#define hweight8(x) generic_hweight8(x) - -#endif /* __KERNEL__ */ - -#ifdef __KERNEL__ - -#define ext2_set_bit __test_and_set_bit -#define ext2_clear_bit __test_and_clear_bit -#define ext2_test_bit test_bit -#define ext2_find_first_zero_bit find_first_zero_bit -#define ext2_find_next_zero_bit find_next_zero_bit - -/* Bitmap functions for the minix filesystem. */ -#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) -#define minix_set_bit(nr,addr) __set_bit(nr,addr) -#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) -#define minix_test_bit(nr,addr) test_bit(nr,addr) -#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) - -#endif /* __KERNEL__ */ - -#endif /* _I386_BITOPS_H */ diff --git a/lib/usb/include/asm/errno.h b/lib/usb/include/asm/errno.h deleted file mode 100644 index 1b6678908..000000000 --- a/lib/usb/include/asm/errno.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef _I386_ERRNO_H -#define _I386_ERRNO_H - -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Argument list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No child processes */ -#define EAGAIN 11 /* Try again */ -#define ENOMEM 12 /* Out of memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* File table overflow */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Math argument out of domain of func */ -#define ERANGE 34 /* Math result not representable */ -#define EDEADLK 35 /* Resource deadlock would occur */ -#define ENAMETOOLONG 36 /* File name too long */ -#define ENOLCK 37 /* No record locks available */ -#define ENOSYS 38 /* Function not implemented */ -#define ENOTEMPTY 39 /* Directory not empty */ -#define ELOOP 40 /* Too many symbolic links encountered */ -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define ENOMSG 42 /* No message of desired type */ -#define EIDRM 43 /* Identifier removed */ -#define ECHRNG 44 /* Channel number out of range */ -#define EL2NSYNC 45 /* Level 2 not synchronized */ -#define EL3HLT 46 /* Level 3 halted */ -#define EL3RST 47 /* Level 3 reset */ -#define ELNRNG 48 /* Link number out of range */ -#define EUNATCH 49 /* Protocol driver not attached */ -#define ENOCSI 50 /* No CSI structure available */ -#define EL2HLT 51 /* Level 2 halted */ -#define EBADE 52 /* Invalid exchange */ -#define EBADR 53 /* Invalid request descriptor */ -#define EXFULL 54 /* Exchange full */ -#define ENOANO 55 /* No anode */ -#define EBADRQC 56 /* Invalid request code */ -#define EBADSLT 57 /* Invalid slot */ - -#define EDEADLOCK EDEADLK - -#define EBFONT 59 /* Bad font file format */ -#define ENOSTR 60 /* Device not a stream */ -#define ENODATA 61 /* No data available */ -#define ETIME 62 /* Timer expired */ -#define ENOSR 63 /* Out of streams resources */ -#define ENONET 64 /* Machine is not on the network */ -#define ENOPKG 65 /* Package not installed */ -#define EREMOTE 66 /* Object is remote */ -#define ENOLINK 67 /* Link has been severed */ -#define EADV 68 /* Advertise error */ -#define ESRMNT 69 /* Srmount error */ -#define ECOMM 70 /* Communication error on send */ -#define EPROTO 71 /* Protocol error */ -#define EMULTIHOP 72 /* Multihop attempted */ -#define EDOTDOT 73 /* RFS specific error */ -#define EBADMSG 74 /* Not a data message */ -#define EOVERFLOW 75 /* Value too large for defined data type */ -#define ENOTUNIQ 76 /* Name not unique on network */ -#define EBADFD 77 /* File descriptor in bad state */ -#define EREMCHG 78 /* Remote address changed */ -#define ELIBACC 79 /* Can not access a needed shared library */ -#define ELIBBAD 80 /* Accessing a corrupted shared library */ -#define ELIBSCN 81 /* .lib section in a.out corrupted */ -#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ -#define ELIBEXEC 83 /* Cannot exec a shared library directly */ -#define EILSEQ 84 /* Illegal byte sequence */ -#define ERESTART 85 /* Interrupted system call should be restarted */ -#define ESTRPIPE 86 /* Streams pipe error */ -#define EUSERS 87 /* Too many users */ -#define ENOTSOCK 88 /* Socket operation on non-socket */ -#define EDESTADDRREQ 89 /* Destination address required */ -#define EMSGSIZE 90 /* Message too long */ -#define EPROTOTYPE 91 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 92 /* Protocol not available */ -#define EPROTONOSUPPORT 93 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define EPFNOSUPPORT 96 /* Protocol family not supported */ -#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ -#define EADDRINUSE 98 /* Address already in use */ -#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ -#define ENETDOWN 100 /* Network is down */ -#define ENETUNREACH 101 /* Network is unreachable */ -#define ENETRESET 102 /* Network dropped connection because of reset */ -#define ECONNABORTED 103 /* Software caused connection abort */ -#define ECONNRESET 104 /* Connection reset by peer */ -#define ENOBUFS 105 /* No buffer space available */ -#define EISCONN 106 /* Transport endpoint is already connected */ -#define ENOTCONN 107 /* Transport endpoint is not connected */ -#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ -#define ETOOMANYREFS 109 /* Too many references: cannot splice */ -#define ETIMEDOUT 110 /* Connection timed out */ -#define ECONNREFUSED 111 /* Connection refused */ -#define EHOSTDOWN 112 /* Host is down */ -#define EHOSTUNREACH 113 /* No route to host */ -#define EALREADY 114 /* Operation already in progress */ -#define EINPROGRESS 115 /* Operation now in progress */ -#define ESTALE 116 /* Stale NFS file handle */ -#define EUCLEAN 117 /* Structure needs cleaning */ -#define ENOTNAM 118 /* Not a XENIX named type file */ -#define ENAVAIL 119 /* No XENIX semaphores available */ -#define EISNAM 120 /* Is a named type file */ -#define EREMOTEIO 121 /* Remote I/O error */ -#define EDQUOT 122 /* Quota exceeded */ - -#define ENOMEDIUM 123 /* No medium found */ -#define EMEDIUMTYPE 124 /* Wrong medium type */ - -#endif diff --git a/lib/usb/include/boot.h b/lib/usb/include/boot.h deleted file mode 100644 index 88d2dec2f..000000000 --- a/lib/usb/include/boot.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _Boot_H_ -#define _Boot_H_ - -/*************************************************************************** - Includes used by XBox boot code - ***************************************************************************/ -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -///////////////////////////////// -// configuration - - -///////// BootUSB.c - -//#include "sys/types.h" -//#include "sys/nttypes.h" - #include -// #include -// #include -#include -#include -// #include - -static inline double min (double a, double b) -{ - if (a < b) return a; else return b; -} - -static inline double max (double a, double b) -{ - if (a > b) return a; else return b; -} - -#endif // _Boot_H_ - diff --git a/lib/usb/include/config.h b/lib/usb/include/config.h deleted file mode 100644 index 43b8766a2..000000000 --- a/lib/usb/include/config.h +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////// compile-time options //////////////////////////////// - -//Cromwell version number -#define VERSION_USB "2.41-dev" - -// selects between the supported video modes, see boot.h for enum listing those available -//#define VIDEO_PREFERRED_MODE VIDEO_MODE_800x600 -#define VIDEO_PREFERRED_MODE VIDEO_MODE_640x480 - -//Uncomment to include BIOS flashing support from CD -//Uncommenting for this release - it's broken for now. -#define FLASH - -//Uncomment to enable the 'advanced menu' -#define ADVANCED_MENU - -//Time to wait in seconds before auto-selecting default item -#define BOOT_TIMEWAIT 15 - -//Uncomment to make connected Xpads rumble briefly at init. -//#define XPAD_VIBRA_STARTUP - -//Uncomment for ultra-quiet mode. Menu is still present, but not -//shown unless you move the xpad. Just backdrop->boot, otherwise -//#define SILENT_MODE - -//Obsolete - - -// display a line like Composite 480 detected if uncommented -#undef REPORT_VIDEO_MODE - -// show the MBR table if the MBR is valid -#undef DISPLAY_MBR_INFO - -#undef DEBUG_MODE -// enable logging to serial port. You probably don't have this. -#define INCLUDE_SERIAL 0 -// enable trace message printing for debugging - with serial only -#define PRINT_TRACE 0 diff --git a/lib/usb/include/consts.h b/lib/usb/include/consts.h deleted file mode 100644 index d3fb6ceba..000000000 --- a/lib/usb/include/consts.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _Consts_H_ -#define _Consts_H_ - -/* - * - * includes for startup code in a form usable by the .S files - * - */ - - /*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#define PCI_CFG_ADDR 0x0CF8 -#define PCI_CFG_DATA 0x0CFC - - -#define I2C_IO_BASE 0xc000 - -#define BUS_0 0 -#define BUS_1 1 - -#define DEV_0 0 -#define DEV_1 1 -#define DEV_2 2 -#define DEV_3 3 -#define DEV_4 4 -#define DEV_5 5 -#define DEV_6 6 -#define DEV_7 7 -#define DEV_8 8 -#define DEV_9 9 -#define DEV_a 0xa -#define DEV_b 0xb -#define DEV_c 0xc -#define DEV_d 0xd -#define DEV_e 0xe -#define DEV_f 0xf -#define DEV_10 0x10 -#define DEV_11 0x11 -#define DEV_12 0x12 -#define DEV_13 0x13 -#define DEV_14 0x14 -#define DEV_15 0x15 -#define DEV_16 0x16 -#define DEV_17 0x17 -#define DEV_18 0x18 -#define DEV_19 0x19 -#define DEV_1a 0x1a -#define DEV_1b 0x1b -#define DEV_1c 0x1c -#define DEV_1d 0x1d -#define DEV_1e 0x1e -#define DEV_1f 0x1f - -#define FUNC_0 0 -/* -#define boot_post_macro(value) \ - movb $(value), %al ;\ - outb %al, $0x80 -*/ - -#endif // _Consts_H_ - - diff --git a/lib/usb/include/cromwell_types.h b/lib/usb/include/cromwell_types.h deleted file mode 100644 index fa83e801a..000000000 --- a/lib/usb/include/cromwell_types.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef cromwell_types_h -#define cromwell_types_h - -#include -// #include -#include - -///////////////////////////////// -// some typedefs to make for easy sizing - -//typedef unsigned long ULONG; -typedef unsigned int u32; -typedef unsigned short u16; -typedef unsigned char u8; -//#ifndef bool_already_defined_ -// typedef int bool; -//#endif -typedef unsigned long RGBA; // LSB=R -> MSB = A -// typedef long long __int64; - -#define guint int -#define guint8 unsigned char - -#define true 1 -#define false 0 - -#ifndef NULL -#define NULL ((void *)0) -#endif - -#endif /* #ifndef cromwell_types_h */ diff --git a/lib/usb/include/linux/bitops.h b/lib/usb/include/linux/bitops.h deleted file mode 100644 index 8c6eccc76..000000000 --- a/lib/usb/include/linux/bitops.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _LINUX_BITOPS_H -#define _LINUX_BITOPS_H - - -/* - * ffs: find first bit set. This is defined the same way as - * the libc and compiler builtin ffs routines, therefore - * differs in spirit from the above ffz (man ffs). - */ - -static inline int generic_ffs(int x) -{ - int r = 1; - - if (!x) - return 0; - if (!(x & 0xffff)) { - x >>= 16; - r += 16; - } - if (!(x & 0xff)) { - x >>= 8; - r += 8; - } - if (!(x & 0xf)) { - x >>= 4; - r += 4; - } - if (!(x & 3)) { - x >>= 2; - r += 2; - } - if (!(x & 1)) { - x >>= 1; - r += 1; - } - return r; -} - -/* - * hweightN: returns the hamming weight (i.e. the number - * of bits set) of a N-bit word - */ - -static inline unsigned int generic_hweight32(unsigned int w) -{ - unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); - res = (res & 0x33333333) + ((res >> 2) & 0x33333333); - res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); - res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); - return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); -} - -static inline unsigned int generic_hweight16(unsigned int w) -{ - unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555); - res = (res & 0x3333) + ((res >> 2) & 0x3333); - res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F); - return (res & 0x00FF) + ((res >> 8) & 0x00FF); -} - -static inline unsigned int generic_hweight8(unsigned int w) -{ - unsigned int res = (w & 0x55) + ((w >> 1) & 0x55); - res = (res & 0x33) + ((res >> 2) & 0x33); - return (res & 0x0F) + ((res >> 4) & 0x0F); -} - -#include "../asm/bitops.h" - - -#endif diff --git a/lib/usb/include/linux/config.h b/lib/usb/include/linux/config.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/usb/include/linux/pci_ids.h b/lib/usb/include/linux/pci_ids.h deleted file mode 100644 index 26ee925b4..000000000 --- a/lib/usb/include/linux/pci_ids.h +++ /dev/null @@ -1,1884 +0,0 @@ -/* - * PCI Class, Vendor and Device IDs - * - * Please keep sorted. - */ - -/* Device classes and subclasses */ - -#define PCI_CLASS_NOT_DEFINED 0x0000 -#define PCI_CLASS_NOT_DEFINED_VGA 0x0001 - -#define PCI_BASE_CLASS_STORAGE 0x01 -#define PCI_CLASS_STORAGE_SCSI 0x0100 -#define PCI_CLASS_STORAGE_IDE 0x0101 -#define PCI_CLASS_STORAGE_FLOPPY 0x0102 -#define PCI_CLASS_STORAGE_IPI 0x0103 -#define PCI_CLASS_STORAGE_RAID 0x0104 -#define PCI_CLASS_STORAGE_OTHER 0x0180 - -#define PCI_BASE_CLASS_NETWORK 0x02 -#define PCI_CLASS_NETWORK_ETHERNET 0x0200 -#define PCI_CLASS_NETWORK_TOKEN_RING 0x0201 -#define PCI_CLASS_NETWORK_FDDI 0x0202 -#define PCI_CLASS_NETWORK_ATM 0x0203 -#define PCI_CLASS_NETWORK_OTHER 0x0280 - -#define PCI_BASE_CLASS_DISPLAY 0x03 -#define PCI_CLASS_DISPLAY_VGA 0x0300 -#define PCI_CLASS_DISPLAY_XGA 0x0301 -#define PCI_CLASS_DISPLAY_3D 0x0302 -#define PCI_CLASS_DISPLAY_OTHER 0x0380 - -#define PCI_BASE_CLASS_MULTIMEDIA 0x04 -#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400 -#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401 -#define PCI_CLASS_MULTIMEDIA_PHONE 0x0402 -#define PCI_CLASS_MULTIMEDIA_OTHER 0x0480 - -#define PCI_BASE_CLASS_MEMORY 0x05 -#define PCI_CLASS_MEMORY_RAM 0x0500 -#define PCI_CLASS_MEMORY_FLASH 0x0501 -#define PCI_CLASS_MEMORY_OTHER 0x0580 - -#define PCI_BASE_CLASS_BRIDGE 0x06 -#define PCI_CLASS_BRIDGE_HOST 0x0600 -#define PCI_CLASS_BRIDGE_ISA 0x0601 -#define PCI_CLASS_BRIDGE_EISA 0x0602 -#define PCI_CLASS_BRIDGE_MC 0x0603 -#define PCI_CLASS_BRIDGE_PCI 0x0604 -#define PCI_CLASS_BRIDGE_PCMCIA 0x0605 -#define PCI_CLASS_BRIDGE_NUBUS 0x0606 -#define PCI_CLASS_BRIDGE_CARDBUS 0x0607 -#define PCI_CLASS_BRIDGE_RACEWAY 0x0608 -#define PCI_CLASS_BRIDGE_OTHER 0x0680 - -#define PCI_BASE_CLASS_COMMUNICATION 0x07 -#define PCI_CLASS_COMMUNICATION_SERIAL 0x0700 -#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701 -#define PCI_CLASS_COMMUNICATION_MULTISERIAL 0x0702 -#define PCI_CLASS_COMMUNICATION_MODEM 0x0703 -#define PCI_CLASS_COMMUNICATION_OTHER 0x0780 - -#define PCI_BASE_CLASS_SYSTEM 0x08 -#define PCI_CLASS_SYSTEM_PIC 0x0800 -#define PCI_CLASS_SYSTEM_DMA 0x0801 -#define PCI_CLASS_SYSTEM_TIMER 0x0802 -#define PCI_CLASS_SYSTEM_RTC 0x0803 -#define PCI_CLASS_SYSTEM_PCI_HOTPLUG 0x0804 -#define PCI_CLASS_SYSTEM_OTHER 0x0880 - -#define PCI_BASE_CLASS_INPUT 0x09 -#define PCI_CLASS_INPUT_KEYBOARD 0x0900 -#define PCI_CLASS_INPUT_PEN 0x0901 -#define PCI_CLASS_INPUT_MOUSE 0x0902 -#define PCI_CLASS_INPUT_SCANNER 0x0903 -#define PCI_CLASS_INPUT_GAMEPORT 0x0904 -#define PCI_CLASS_INPUT_OTHER 0x0980 - -#define PCI_BASE_CLASS_DOCKING 0x0a -#define PCI_CLASS_DOCKING_GENERIC 0x0a00 -#define PCI_CLASS_DOCKING_OTHER 0x0a80 - -#define PCI_BASE_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_PROCESSOR_386 0x0b00 -#define PCI_CLASS_PROCESSOR_486 0x0b01 -#define PCI_CLASS_PROCESSOR_PENTIUM 0x0b02 -#define PCI_CLASS_PROCESSOR_ALPHA 0x0b10 -#define PCI_CLASS_PROCESSOR_POWERPC 0x0b20 -#define PCI_CLASS_PROCESSOR_MIPS 0x0b30 -#define PCI_CLASS_PROCESSOR_CO 0x0b40 - -#define PCI_BASE_CLASS_SERIAL 0x0c -#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00 -#define PCI_CLASS_SERIAL_ACCESS 0x0c01 -#define PCI_CLASS_SERIAL_SSA 0x0c02 -#define PCI_CLASS_SERIAL_USB 0x0c03 -#define PCI_CLASS_SERIAL_FIBER 0x0c04 -#define PCI_CLASS_SERIAL_SMBUS 0x0c05 - -#define PCI_BASE_CLASS_INTELLIGENT 0x0e -#define PCI_CLASS_INTELLIGENT_I2O 0x0e00 - -#define PCI_BASE_CLASS_SATELLITE 0x0f -#define PCI_CLASS_SATELLITE_TV 0x0f00 -#define PCI_CLASS_SATELLITE_AUDIO 0x0f01 -#define PCI_CLASS_SATELLITE_VOICE 0x0f03 -#define PCI_CLASS_SATELLITE_DATA 0x0f04 - -#define PCI_BASE_CLASS_CRYPT 0x10 -#define PCI_CLASS_CRYPT_NETWORK 0x1000 -#define PCI_CLASS_CRYPT_ENTERTAINMENT 0x1001 -#define PCI_CLASS_CRYPT_OTHER 0x1080 - -#define PCI_BASE_CLASS_SIGNAL_PROCESSING 0x11 -#define PCI_CLASS_SP_DPIO 0x1100 -#define PCI_CLASS_SP_OTHER 0x1180 - -#define PCI_CLASS_OTHERS 0xff - -/* Vendors and devices. Sort key: vendor first, device next. */ - -#define PCI_VENDOR_ID_DYNALINK 0x0675 -#define PCI_DEVICE_ID_DYNALINK_IS64PH 0x1702 - -#define PCI_VENDOR_ID_BERKOM 0x0871 -#define PCI_DEVICE_ID_BERKOM_A1T 0xffa1 -#define PCI_DEVICE_ID_BERKOM_T_CONCEPT 0xffa2 -#define PCI_DEVICE_ID_BERKOM_A4T 0xffa4 -#define PCI_DEVICE_ID_BERKOM_SCITEL_QUADRO 0xffa8 - -#define PCI_VENDOR_ID_COMPAQ 0x0e11 -#define PCI_DEVICE_ID_COMPAQ_TOKENRING 0x0508 -#define PCI_DEVICE_ID_COMPAQ_1280 0x3033 -#define PCI_DEVICE_ID_COMPAQ_TRIFLEX 0x4000 -#define PCI_DEVICE_ID_COMPAQ_6010 0x6010 -#define PCI_DEVICE_ID_COMPAQ_TACHYON 0xa0fc -#define PCI_DEVICE_ID_COMPAQ_SMART2P 0xae10 -#define PCI_DEVICE_ID_COMPAQ_NETEL100 0xae32 -#define PCI_DEVICE_ID_COMPAQ_TRIFLEX_IDE 0xae33 -#define PCI_DEVICE_ID_COMPAQ_NETEL10 0xae34 -#define PCI_DEVICE_ID_COMPAQ_NETFLEX3I 0xae35 -#define PCI_DEVICE_ID_COMPAQ_NETEL100D 0xae40 -#define PCI_DEVICE_ID_COMPAQ_NETEL100PI 0xae43 -#define PCI_DEVICE_ID_COMPAQ_NETEL100I 0xb011 -#define PCI_DEVICE_ID_COMPAQ_CISS 0xb060 -#define PCI_DEVICE_ID_COMPAQ_CISSB 0xb178 -#define PCI_DEVICE_ID_COMPAQ_CISSC 0x0046 -#define PCI_DEVICE_ID_COMPAQ_THUNDER 0xf130 -#define PCI_DEVICE_ID_COMPAQ_NETFLEX3B 0xf150 - -#define PCI_VENDOR_ID_NCR 0x1000 -#define PCI_VENDOR_ID_LSI_LOGIC 0x1000 -#define PCI_DEVICE_ID_NCR_53C810 0x0001 -#define PCI_DEVICE_ID_NCR_53C820 0x0002 -#define PCI_DEVICE_ID_NCR_53C825 0x0003 -#define PCI_DEVICE_ID_NCR_53C815 0x0004 -#define PCI_DEVICE_ID_LSI_53C810AP 0x0005 -#define PCI_DEVICE_ID_NCR_53C860 0x0006 -#define PCI_DEVICE_ID_LSI_53C1510 0x000a -#define PCI_DEVICE_ID_NCR_53C896 0x000b -#define PCI_DEVICE_ID_NCR_53C895 0x000c -#define PCI_DEVICE_ID_NCR_53C885 0x000d -#define PCI_DEVICE_ID_NCR_53C875 0x000f -#define PCI_DEVICE_ID_NCR_53C1510 0x0010 -#define PCI_DEVICE_ID_LSI_53C895A 0x0012 -#define PCI_DEVICE_ID_LSI_53C875A 0x0013 -#define PCI_DEVICE_ID_LSI_53C1010_33 0x0020 -#define PCI_DEVICE_ID_LSI_53C1010_66 0x0021 -#define PCI_DEVICE_ID_LSI_53C1030 0x0030 -#define PCI_DEVICE_ID_LSI_53C1035 0x0040 -#define PCI_DEVICE_ID_NCR_53C875J 0x008f -#define PCI_DEVICE_ID_LSI_FC909 0x0621 -#define PCI_DEVICE_ID_LSI_FC929 0x0622 -#define PCI_DEVICE_ID_LSI_FC929_LAN 0x0623 -#define PCI_DEVICE_ID_LSI_FC919 0x0624 -#define PCI_DEVICE_ID_LSI_FC919_LAN 0x0625 -#define PCI_DEVICE_ID_LSI_FC929X 0x0626 -#define PCI_DEVICE_ID_LSI_FC919X 0x0628 -#define PCI_DEVICE_ID_NCR_YELLOWFIN 0x0701 -#define PCI_DEVICE_ID_LSI_61C102 0x0901 -#define PCI_DEVICE_ID_LSI_63C815 0x1000 - -#define PCI_VENDOR_ID_ATI 0x1002 -/* Mach64 */ -#define PCI_DEVICE_ID_ATI_68800 0x4158 -#define PCI_DEVICE_ID_ATI_215CT222 0x4354 -#define PCI_DEVICE_ID_ATI_210888CX 0x4358 -#define PCI_DEVICE_ID_ATI_215ET222 0x4554 -/* Mach64 / Rage */ -#define PCI_DEVICE_ID_ATI_215GB 0x4742 -#define PCI_DEVICE_ID_ATI_215GD 0x4744 -#define PCI_DEVICE_ID_ATI_215GI 0x4749 -#define PCI_DEVICE_ID_ATI_215GP 0x4750 -#define PCI_DEVICE_ID_ATI_215GQ 0x4751 -#define PCI_DEVICE_ID_ATI_215XL 0x4752 -#define PCI_DEVICE_ID_ATI_215GT 0x4754 -#define PCI_DEVICE_ID_ATI_215GTB 0x4755 -#define PCI_DEVICE_ID_ATI_215_IV 0x4756 -#define PCI_DEVICE_ID_ATI_215_IW 0x4757 -#define PCI_DEVICE_ID_ATI_215_IZ 0x475A -#define PCI_DEVICE_ID_ATI_210888GX 0x4758 -#define PCI_DEVICE_ID_ATI_215_LB 0x4c42 -#define PCI_DEVICE_ID_ATI_215_LD 0x4c44 -#define PCI_DEVICE_ID_ATI_215_LG 0x4c47 -#define PCI_DEVICE_ID_ATI_215_LI 0x4c49 -#define PCI_DEVICE_ID_ATI_215_LM 0x4c4D -#define PCI_DEVICE_ID_ATI_215_LN 0x4c4E -#define PCI_DEVICE_ID_ATI_215_LR 0x4c52 -#define PCI_DEVICE_ID_ATI_215_LS 0x4c53 -#define PCI_DEVICE_ID_ATI_264_LT 0x4c54 -/* Mach64 VT */ -#define PCI_DEVICE_ID_ATI_264VT 0x5654 -#define PCI_DEVICE_ID_ATI_264VU 0x5655 -#define PCI_DEVICE_ID_ATI_264VV 0x5656 -/* Rage128 Pro GL */ -#define PCI_DEVICE_ID_ATI_Rage128_PA 0x5041 -#define PCI_DEVICE_ID_ATI_Rage128_PB 0x5042 -#define PCI_DEVICE_ID_ATI_Rage128_PC 0x5043 -#define PCI_DEVICE_ID_ATI_Rage128_PD 0x5044 -#define PCI_DEVICE_ID_ATI_Rage128_PE 0x5045 -#define PCI_DEVICE_ID_ATI_RAGE128_PF 0x5046 -/* Rage128 Pro VR */ -#define PCI_DEVICE_ID_ATI_RAGE128_PG 0x5047 -#define PCI_DEVICE_ID_ATI_RAGE128_PH 0x5048 -#define PCI_DEVICE_ID_ATI_RAGE128_PI 0x5049 -#define PCI_DEVICE_ID_ATI_RAGE128_PJ 0x504A -#define PCI_DEVICE_ID_ATI_RAGE128_PK 0x504B -#define PCI_DEVICE_ID_ATI_RAGE128_PL 0x504C -#define PCI_DEVICE_ID_ATI_RAGE128_PM 0x504D -#define PCI_DEVICE_ID_ATI_RAGE128_PN 0x504E -#define PCI_DEVICE_ID_ATI_RAGE128_PO 0x504F -#define PCI_DEVICE_ID_ATI_RAGE128_PP 0x5050 -#define PCI_DEVICE_ID_ATI_RAGE128_PQ 0x5051 -#define PCI_DEVICE_ID_ATI_RAGE128_PR 0x5052 -#define PCI_DEVICE_ID_ATI_RAGE128_TR 0x5452 -#define PCI_DEVICE_ID_ATI_RAGE128_PS 0x5053 -#define PCI_DEVICE_ID_ATI_RAGE128_PT 0x5054 -#define PCI_DEVICE_ID_ATI_RAGE128_PU 0x5055 -#define PCI_DEVICE_ID_ATI_RAGE128_PV 0x5056 -#define PCI_DEVICE_ID_ATI_RAGE128_PW 0x5057 -#define PCI_DEVICE_ID_ATI_RAGE128_PX 0x5058 -/* Rage128 GL */ -#define PCI_DEVICE_ID_ATI_RAGE128_RE 0x5245 -#define PCI_DEVICE_ID_ATI_RAGE128_RF 0x5246 -#define PCI_DEVICE_ID_ATI_RAGE128_RG 0x534b -#define PCI_DEVICE_ID_ATI_RAGE128_RH 0x534c -#define PCI_DEVICE_ID_ATI_RAGE128_RI 0x534d -/* Rage128 VR */ -#define PCI_DEVICE_ID_ATI_RAGE128_RK 0x524b -#define PCI_DEVICE_ID_ATI_RAGE128_RL 0x524c -#define PCI_DEVICE_ID_ATI_RAGE128_RM 0x5345 -#define PCI_DEVICE_ID_ATI_RAGE128_RN 0x5346 -#define PCI_DEVICE_ID_ATI_RAGE128_RO 0x5347 -/* Rage128 M3 */ -#define PCI_DEVICE_ID_ATI_RAGE128_LE 0x4c45 -#define PCI_DEVICE_ID_ATI_RAGE128_LF 0x4c46 -/* Rage128 Pro Ultra */ -#define PCI_DEVICE_ID_ATI_RAGE128_U1 0x5446 -#define PCI_DEVICE_ID_ATI_RAGE128_U2 0x544C -#define PCI_DEVICE_ID_ATI_RAGE128_U3 0x5452 -/* Radeon M4 */ -#define PCI_DEVICE_ID_ATI_RADEON_LE 0x4d45 -#define PCI_DEVICE_ID_ATI_RADEON_LF 0x4d46 -/* Radeon NV-100 */ -#define PCI_DEVICE_ID_ATI_RADEON_N1 0x5159 -#define PCI_DEVICE_ID_ATI_RADEON_N2 0x515a -/* Radeon */ -#define PCI_DEVICE_ID_ATI_RADEON_RA 0x5144 -#define PCI_DEVICE_ID_ATI_RADEON_RB 0x5145 -#define PCI_DEVICE_ID_ATI_RADEON_RC 0x5146 -#define PCI_DEVICE_ID_ATI_RADEON_RD 0x5147 -/* RadeonIGP */ -#define PCI_DEVICE_ID_ATI_RADEON_IGP 0xCAB0 - -#define PCI_VENDOR_ID_VLSI 0x1004 -#define PCI_DEVICE_ID_VLSI_82C592 0x0005 -#define PCI_DEVICE_ID_VLSI_82C593 0x0006 -#define PCI_DEVICE_ID_VLSI_82C594 0x0007 -#define PCI_DEVICE_ID_VLSI_82C597 0x0009 -#define PCI_DEVICE_ID_VLSI_82C541 0x000c -#define PCI_DEVICE_ID_VLSI_82C543 0x000d -#define PCI_DEVICE_ID_VLSI_82C532 0x0101 -#define PCI_DEVICE_ID_VLSI_82C534 0x0102 -#define PCI_DEVICE_ID_VLSI_82C535 0x0104 -#define PCI_DEVICE_ID_VLSI_82C147 0x0105 -#define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 - -#define PCI_VENDOR_ID_ADL 0x1005 -#define PCI_DEVICE_ID_ADL_2301 0x2301 - -#define PCI_VENDOR_ID_NS 0x100b -#define PCI_DEVICE_ID_NS_87415 0x0002 -#define PCI_DEVICE_ID_NS_87560_LIO 0x000e -#define PCI_DEVICE_ID_NS_87560_USB 0x0012 -#define PCI_DEVICE_ID_NS_83815 0x0020 -#define PCI_DEVICE_ID_NS_83820 0x0022 -#define PCI_DEVICE_ID_NS_SCx200_BRIDGE 0x0500 -#define PCI_DEVICE_ID_NS_SCx200_SMI 0x0501 -#define PCI_DEVICE_ID_NS_SCx200_IDE 0x0502 -#define PCI_DEVICE_ID_NS_SCx200_AUDIO 0x0503 -#define PCI_DEVICE_ID_NS_SCx200_VIDEO 0x0504 -#define PCI_DEVICE_ID_NS_SCx200_XBUS 0x0505 -#define PCI_DEVICE_ID_NS_87410 0xd001 - -#define PCI_VENDOR_ID_TSENG 0x100c -#define PCI_DEVICE_ID_TSENG_W32P_2 0x3202 -#define PCI_DEVICE_ID_TSENG_W32P_b 0x3205 -#define PCI_DEVICE_ID_TSENG_W32P_c 0x3206 -#define PCI_DEVICE_ID_TSENG_W32P_d 0x3207 -#define PCI_DEVICE_ID_TSENG_ET6000 0x3208 - -#define PCI_VENDOR_ID_WEITEK 0x100e -#define PCI_DEVICE_ID_WEITEK_P9000 0x9001 -#define PCI_DEVICE_ID_WEITEK_P9100 0x9100 - -#define PCI_VENDOR_ID_DEC 0x1011 -#define PCI_DEVICE_ID_DEC_BRD 0x0001 -#define PCI_DEVICE_ID_DEC_TULIP 0x0002 -#define PCI_DEVICE_ID_DEC_TGA 0x0004 -#define PCI_DEVICE_ID_DEC_TULIP_FAST 0x0009 -#define PCI_DEVICE_ID_DEC_TGA2 0x000D -#define PCI_DEVICE_ID_DEC_FDDI 0x000F -#define PCI_DEVICE_ID_DEC_TULIP_PLUS 0x0014 -#define PCI_DEVICE_ID_DEC_21142 0x0019 -#define PCI_DEVICE_ID_DEC_21052 0x0021 -#define PCI_DEVICE_ID_DEC_21150 0x0022 -#define PCI_DEVICE_ID_DEC_21152 0x0024 -#define PCI_DEVICE_ID_DEC_21153 0x0025 -#define PCI_DEVICE_ID_DEC_21154 0x0026 -#define PCI_DEVICE_ID_DEC_21285 0x1065 -#define PCI_DEVICE_ID_COMPAQ_42XX 0x0046 - -#define PCI_VENDOR_ID_CIRRUS 0x1013 -#define PCI_DEVICE_ID_CIRRUS_7548 0x0038 -#define PCI_DEVICE_ID_CIRRUS_5430 0x00a0 -#define PCI_DEVICE_ID_CIRRUS_5434_4 0x00a4 -#define PCI_DEVICE_ID_CIRRUS_5434_8 0x00a8 -#define PCI_DEVICE_ID_CIRRUS_5436 0x00ac -#define PCI_DEVICE_ID_CIRRUS_5446 0x00b8 -#define PCI_DEVICE_ID_CIRRUS_5480 0x00bc -#define PCI_DEVICE_ID_CIRRUS_5462 0x00d0 -#define PCI_DEVICE_ID_CIRRUS_5464 0x00d4 -#define PCI_DEVICE_ID_CIRRUS_5465 0x00d6 -#define PCI_DEVICE_ID_CIRRUS_6729 0x1100 -#define PCI_DEVICE_ID_CIRRUS_6832 0x1110 -#define PCI_DEVICE_ID_CIRRUS_7542 0x1200 -#define PCI_DEVICE_ID_CIRRUS_7543 0x1202 -#define PCI_DEVICE_ID_CIRRUS_7541 0x1204 - -#define PCI_VENDOR_ID_IBM 0x1014 -#define PCI_DEVICE_ID_IBM_FIRE_CORAL 0x000a -#define PCI_DEVICE_ID_IBM_TR 0x0018 -#define PCI_DEVICE_ID_IBM_82G2675 0x001d -#define PCI_DEVICE_ID_IBM_MCA 0x0020 -#define PCI_DEVICE_ID_IBM_82351 0x0022 -#define PCI_DEVICE_ID_IBM_PYTHON 0x002d -#define PCI_DEVICE_ID_IBM_SERVERAID 0x002e -#define PCI_DEVICE_ID_IBM_TR_WAKE 0x003e -#define PCI_DEVICE_ID_IBM_MPIC 0x0046 -#define PCI_DEVICE_ID_IBM_3780IDSP 0x007d -#define PCI_DEVICE_ID_IBM_CHUKAR 0x0096 -#define PCI_DEVICE_ID_IBM_CPC710_PCI64 0x00fc -#define PCI_DEVICE_ID_IBM_CPC710_PCI32 0x0105 -#define PCI_DEVICE_ID_IBM_405GP 0x0156 -#define PCI_DEVICE_ID_IBM_SERVERAIDI960 0x01bd -#define PCI_DEVICE_ID_IBM_MPIC_2 0xffff - -#define PCI_VENDOR_ID_COMPEX2 0x101a // pci.ids says "AT&T GIS (NCR)" -#define PCI_DEVICE_ID_COMPEX2_100VG 0x0005 - -#define PCI_VENDOR_ID_WD 0x101c -#define PCI_DEVICE_ID_WD_7197 0x3296 -#define PCI_DEVICE_ID_WD_90C 0xc24a - -#define PCI_VENDOR_ID_AMI 0x101e -#define PCI_DEVICE_ID_AMI_MEGARAID3 0x1960 -#define PCI_DEVICE_ID_AMI_MEGARAID 0x9010 -#define PCI_DEVICE_ID_AMI_MEGARAID2 0x9060 - -#define PCI_VENDOR_ID_AMD 0x1022 -#define PCI_DEVICE_ID_AMD_LANCE 0x2000 -#define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 -#define PCI_DEVICE_ID_AMD_SCSI 0x2020 -#define PCI_DEVICE_ID_AMD_FE_GATE_7006 0x7006 -#define PCI_DEVICE_ID_AMD_FE_GATE_7007 0x7007 -#define PCI_DEVICE_ID_AMD_FE_GATE_700C 0x700C -#define PCI_DEVICE_ID_AMD_FE_GATE_700D 0x700D -#define PCI_DEVICE_ID_AMD_FE_GATE_700E 0x700E -#define PCI_DEVICE_ID_AMD_FE_GATE_700F 0x700F -#define PCI_DEVICE_ID_AMD_COBRA_7400 0x7400 -#define PCI_DEVICE_ID_AMD_COBRA_7401 0x7401 -#define PCI_DEVICE_ID_AMD_COBRA_7403 0x7403 -#define PCI_DEVICE_ID_AMD_COBRA_7404 0x7404 -#define PCI_DEVICE_ID_AMD_VIPER_7408 0x7408 -#define PCI_DEVICE_ID_AMD_VIPER_7409 0x7409 -#define PCI_DEVICE_ID_AMD_VIPER_740B 0x740B -#define PCI_DEVICE_ID_AMD_VIPER_740C 0x740C -#define PCI_DEVICE_ID_AMD_VIPER_7410 0x7410 -#define PCI_DEVICE_ID_AMD_VIPER_7411 0x7411 -#define PCI_DEVICE_ID_AMD_VIPER_7413 0x7413 -#define PCI_DEVICE_ID_AMD_VIPER_7414 0x7414 -#define PCI_DEVICE_ID_AMD_OPUS_7440 0x7440 -# define PCI_DEVICE_ID_AMD_VIPER_7440 PCI_DEVICE_ID_AMD_OPUS_7440 -#define PCI_DEVICE_ID_AMD_OPUS_7441 0x7441 -# define PCI_DEVICE_ID_AMD_VIPER_7441 PCI_DEVICE_ID_AMD_OPUS_7441 -#define PCI_DEVICE_ID_AMD_OPUS_7443 0x7443 -# define PCI_DEVICE_ID_AMD_VIPER_7443 PCI_DEVICE_ID_AMD_OPUS_7443 -#define PCI_DEVICE_ID_AMD_OPUS_7448 0x7448 -# define PCI_DEVICE_ID_AMD_VIPER_7448 PCI_DEVICE_ID_AMD_OPUS_7448 -#define PCI_DEVICE_ID_AMD_OPUS_7449 0x7449 -# define PCI_DEVICE_ID_AMD_VIPER_7449 PCI_DEVICE_ID_AMD_OPUS_7449 -#define PCI_DEVICE_ID_AMD_8111_LAN 0x7462 -#define PCI_DEVICE_ID_AMD_8111_IDE 0x7469 -#define PCI_DEVICE_ID_AMD_8111_AC97 0x746d -#define PCI_DEVICE_ID_AMD_8131_APIC 0x7450 - -#define PCI_VENDOR_ID_TRIDENT 0x1023 -#define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 -#define PCI_DEVICE_ID_TRIDENT_4DWAVE_NX 0x2001 -#define PCI_DEVICE_ID_TRIDENT_9320 0x9320 -#define PCI_DEVICE_ID_TRIDENT_9388 0x9388 -#define PCI_DEVICE_ID_TRIDENT_9397 0x9397 -#define PCI_DEVICE_ID_TRIDENT_939A 0x939A -#define PCI_DEVICE_ID_TRIDENT_9520 0x9520 -#define PCI_DEVICE_ID_TRIDENT_9525 0x9525 -#define PCI_DEVICE_ID_TRIDENT_9420 0x9420 -#define PCI_DEVICE_ID_TRIDENT_9440 0x9440 -#define PCI_DEVICE_ID_TRIDENT_9660 0x9660 -#define PCI_DEVICE_ID_TRIDENT_9750 0x9750 -#define PCI_DEVICE_ID_TRIDENT_9850 0x9850 -#define PCI_DEVICE_ID_TRIDENT_9880 0x9880 -#define PCI_DEVICE_ID_TRIDENT_8400 0x8400 -#define PCI_DEVICE_ID_TRIDENT_8420 0x8420 -#define PCI_DEVICE_ID_TRIDENT_8500 0x8500 - -#define PCI_VENDOR_ID_AI 0x1025 -#define PCI_DEVICE_ID_AI_M1435 0x1435 - -#define PCI_VENDOR_ID_DELL 0x1028 - -#define PCI_VENDOR_ID_MATROX 0x102B -#define PCI_DEVICE_ID_MATROX_MGA_2 0x0518 -#define PCI_DEVICE_ID_MATROX_MIL 0x0519 -#define PCI_DEVICE_ID_MATROX_MYS 0x051A -#define PCI_DEVICE_ID_MATROX_MIL_2 0x051b -#define PCI_DEVICE_ID_MATROX_MIL_2_AGP 0x051f -#define PCI_DEVICE_ID_MATROX_MGA_IMP 0x0d10 -#define PCI_DEVICE_ID_MATROX_G100_MM 0x1000 -#define PCI_DEVICE_ID_MATROX_G100_AGP 0x1001 -#define PCI_DEVICE_ID_MATROX_G200_PCI 0x0520 -#define PCI_DEVICE_ID_MATROX_G200_AGP 0x0521 -#define PCI_DEVICE_ID_MATROX_G400 0x0525 -#define PCI_DEVICE_ID_MATROX_G550 0x2527 -#define PCI_DEVICE_ID_MATROX_VIA 0x4536 - -#define PCI_VENDOR_ID_CT 0x102c -#define PCI_DEVICE_ID_CT_65545 0x00d8 -#define PCI_DEVICE_ID_CT_65548 0x00dc -#define PCI_DEVICE_ID_CT_65550 0x00e0 -#define PCI_DEVICE_ID_CT_65554 0x00e4 -#define PCI_DEVICE_ID_CT_65555 0x00e5 - -#define PCI_VENDOR_ID_MIRO 0x1031 -#define PCI_DEVICE_ID_MIRO_36050 0x5601 - -#define PCI_VENDOR_ID_NEC 0x1033 -#define PCI_DEVICE_ID_NEC_PCX2 0x0046 -#define PCI_DEVICE_ID_NEC_NILE4 0x005a -#define PCI_DEVICE_ID_NEC_VRC5476 0x009b -#define PCI_DEVICE_ID_NEC_VRC5477_AC97 0x00a6 - -#define PCI_VENDOR_ID_FD 0x1036 -#define PCI_DEVICE_ID_FD_36C70 0x0000 - -#define PCI_VENDOR_ID_SI 0x1039 -#define PCI_DEVICE_ID_SI_5591_AGP 0x0001 -#define PCI_DEVICE_ID_SI_6202 0x0002 -#define PCI_DEVICE_ID_SI_503 0x0008 -#define PCI_DEVICE_ID_SI_ACPI 0x0009 -#define PCI_DEVICE_ID_SI_5597_VGA 0x0200 -#define PCI_DEVICE_ID_SI_6205 0x0205 -#define PCI_DEVICE_ID_SI_501 0x0406 -#define PCI_DEVICE_ID_SI_496 0x0496 -#define PCI_DEVICE_ID_SI_300 0x0300 -#define PCI_DEVICE_ID_SI_315H 0x0310 -#define PCI_DEVICE_ID_SI_315 0x0315 -#define PCI_DEVICE_ID_SI_315PRO 0x0325 -#define PCI_DEVICE_ID_SI_530 0x0530 -#define PCI_DEVICE_ID_SI_540 0x0540 -#define PCI_DEVICE_ID_SI_550 0x0550 -#define PCI_DEVICE_ID_SI_540_VGA 0x5300 -#define PCI_DEVICE_ID_SI_550_VGA 0x5315 -#define PCI_DEVICE_ID_SI_601 0x0601 -#define PCI_DEVICE_ID_SI_620 0x0620 -#define PCI_DEVICE_ID_SI_630 0x0630 -#define PCI_DEVICE_ID_SI_635 0x0635 -#define PCI_DEVICE_ID_SI_640 0x0640 -#define PCI_DEVICE_ID_SI_645 0x0645 -#define PCI_DEVICE_ID_SI_646 0x0646 -#define PCI_DEVICE_ID_SI_648 0x0648 -#define PCI_DEVICE_ID_SI_650 0x0650 -#define PCI_DEVICE_ID_SI_651 0x0651 -#define PCI_DEVICE_ID_SI_652 0x0652 -#define PCI_DEVICE_ID_SI_730 0x0730 -#define PCI_DEVICE_ID_SI_630_VGA 0x6300 -#define PCI_DEVICE_ID_SI_730_VGA 0x7300 -#define PCI_DEVICE_ID_SI_735 0x0735 -#define PCI_DEVICE_ID_SI_740 0x0740 -#define PCI_DEVICE_ID_SI_745 0x0745 -#define PCI_DEVICE_ID_SI_746 0x0746 -#define PCI_DEVICE_ID_SI_748 0x0748 -#define PCI_DEVICE_ID_SI_750 0x0750 -#define PCI_DEVICE_ID_SI_751 0x0751 -#define PCI_DEVICE_ID_SI_752 0x0752 -#define PCI_DEVICE_ID_SI_900 0x0900 -#define PCI_DEVICE_ID_SI_5107 0x5107 -#define PCI_DEVICE_ID_SI_5300 0x5300 -#define PCI_DEVICE_ID_SI_5511 0x5511 -#define PCI_DEVICE_ID_SI_5513 0x5513 -#define PCI_DEVICE_ID_SI_5518 0x5518 -#define PCI_DEVICE_ID_SI_5571 0x5571 -#define PCI_DEVICE_ID_SI_5591 0x5591 -#define PCI_DEVICE_ID_SI_5597 0x5597 -#define PCI_DEVICE_ID_SI_5598 0x5598 -#define PCI_DEVICE_ID_SI_5600 0x5600 -#define PCI_DEVICE_ID_SI_6300 0x6300 -#define PCI_DEVICE_ID_SI_6306 0x6306 -#define PCI_DEVICE_ID_SI_6326 0x6326 -#define PCI_DEVICE_ID_SI_7001 0x7001 -#define PCI_DEVICE_ID_SI_7016 0x7016 - -#define PCI_VENDOR_ID_HP 0x103c -#define PCI_DEVICE_ID_HP_DONNER_GFX 0x1008 -#define PCI_DEVICE_ID_HP_TACHYON 0x1028 -#define PCI_DEVICE_ID_HP_TACHLITE 0x1029 -#define PCI_DEVICE_ID_HP_J2585A 0x1030 -#define PCI_DEVICE_ID_HP_J2585B 0x1031 -#define PCI_DEVICE_ID_HP_SAS 0x1048 -#define PCI_DEVICE_ID_HP_DIVA1 0x1049 -#define PCI_DEVICE_ID_HP_DIVA2 0x104A -#define PCI_DEVICE_ID_HP_SP2_0 0x104B -#define PCI_DEVICE_ID_HP_REO_SBA 0x10f0 -#define PCI_DEVICE_ID_HP_REO_IOC 0x10f1 -#define PCI_DEVICE_ID_HP_ZX1_SBA 0x1229 -#define PCI_DEVICE_ID_HP_ZX1_IOC 0x122a -#define PCI_DEVICE_ID_HP_ZX1_LBA 0x122e - -#define PCI_VENDOR_ID_PCTECH 0x1042 -#define PCI_DEVICE_ID_PCTECH_RZ1000 0x1000 -#define PCI_DEVICE_ID_PCTECH_RZ1001 0x1001 -#define PCI_DEVICE_ID_PCTECH_SAMURAI_0 0x3000 -#define PCI_DEVICE_ID_PCTECH_SAMURAI_1 0x3010 -#define PCI_DEVICE_ID_PCTECH_SAMURAI_IDE 0x3020 - -#define PCI_VENDOR_ID_ASUSTEK 0x1043 -#define PCI_DEVICE_ID_ASUSTEK_0675 0x0675 - -#define PCI_VENDOR_ID_DPT 0x1044 -#define PCI_DEVICE_ID_DPT 0xa400 - -#define PCI_VENDOR_ID_OPTI 0x1045 -#define PCI_DEVICE_ID_OPTI_92C178 0xc178 -#define PCI_DEVICE_ID_OPTI_82C557 0xc557 -#define PCI_DEVICE_ID_OPTI_82C558 0xc558 -#define PCI_DEVICE_ID_OPTI_82C621 0xc621 -#define PCI_DEVICE_ID_OPTI_82C700 0xc700 -#define PCI_DEVICE_ID_OPTI_82C701 0xc701 -#define PCI_DEVICE_ID_OPTI_82C814 0xc814 -#define PCI_DEVICE_ID_OPTI_82C822 0xc822 -#define PCI_DEVICE_ID_OPTI_82C861 0xc861 -#define PCI_DEVICE_ID_OPTI_82C825 0xd568 - -#define PCI_VENDOR_ID_ELSA 0x1048 -#define PCI_DEVICE_ID_ELSA_MICROLINK 0x1000 -#define PCI_DEVICE_ID_ELSA_QS3000 0x3000 - -#define PCI_VENDOR_ID_SGS 0x104a -#define PCI_DEVICE_ID_SGS_2000 0x0008 -#define PCI_DEVICE_ID_SGS_1764 0x0009 - -#define PCI_VENDOR_ID_BUSLOGIC 0x104B -#define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140 -#define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER 0x1040 -#define PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT 0x8130 - -#define PCI_VENDOR_ID_TI 0x104c -#define PCI_DEVICE_ID_TI_TVP4010 0x3d04 -#define PCI_DEVICE_ID_TI_TVP4020 0x3d07 -#define PCI_DEVICE_ID_TI_1130 0xac12 -#define PCI_DEVICE_ID_TI_1031 0xac13 -#define PCI_DEVICE_ID_TI_1131 0xac15 -#define PCI_DEVICE_ID_TI_1250 0xac16 -#define PCI_DEVICE_ID_TI_1220 0xac17 -#define PCI_DEVICE_ID_TI_1221 0xac19 -#define PCI_DEVICE_ID_TI_1210 0xac1a -#define PCI_DEVICE_ID_TI_1410 0xac50 -#define PCI_DEVICE_ID_TI_1450 0xac1b -#define PCI_DEVICE_ID_TI_1225 0xac1c -#define PCI_DEVICE_ID_TI_1251A 0xac1d -#define PCI_DEVICE_ID_TI_1211 0xac1e -#define PCI_DEVICE_ID_TI_1251B 0xac1f -#define PCI_DEVICE_ID_TI_4410 0xac41 -#define PCI_DEVICE_ID_TI_4451 0xac42 -#define PCI_DEVICE_ID_TI_1420 0xac51 - -#define PCI_VENDOR_ID_SONY 0x104d -#define PCI_DEVICE_ID_SONY_CXD3222 0x8039 - -#define PCI_VENDOR_ID_OAK 0x104e -#define PCI_DEVICE_ID_OAK_OTI107 0x0107 - -/* Winbond have two vendor IDs! See 0x10ad as well */ -#define PCI_VENDOR_ID_WINBOND2 0x1050 -#define PCI_DEVICE_ID_WINBOND2_89C940 0x0940 -#define PCI_DEVICE_ID_WINBOND2_89C940F 0x5a5a -#define PCI_DEVICE_ID_WINBOND2_6692 0x6692 - -#define PCI_VENDOR_ID_ANIGMA 0x1051 -#define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 - -#define PCI_VENDOR_ID_EFAR 0x1055 -#define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130 -#define PCI_DEVICE_ID_EFAR_SLC90E66_0 0x9460 -#define PCI_DEVICE_ID_EFAR_SLC90E66_2 0x9462 -#define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463 - -#define PCI_VENDOR_ID_MOTOROLA 0x1057 -#define PCI_VENDOR_ID_MOTOROLA_OOPS 0x1507 -#define PCI_DEVICE_ID_MOTOROLA_MPC105 0x0001 -#define PCI_DEVICE_ID_MOTOROLA_MPC106 0x0002 -#define PCI_DEVICE_ID_MOTOROLA_MPC107 0x0004 -#define PCI_DEVICE_ID_MOTOROLA_RAVEN 0x4801 -#define PCI_DEVICE_ID_MOTOROLA_FALCON 0x4802 -#define PCI_DEVICE_ID_MOTOROLA_HAWK 0x4803 -#define PCI_DEVICE_ID_MOTOROLA_CPX8216 0x4806 - -#define PCI_VENDOR_ID_PROMISE 0x105a -#define PCI_DEVICE_ID_PROMISE_20265 0x0d30 -#define PCI_DEVICE_ID_PROMISE_20267 0x4d30 -#define PCI_DEVICE_ID_PROMISE_20246 0x4d33 -#define PCI_DEVICE_ID_PROMISE_20262 0x4d38 -#define PCI_DEVICE_ID_PROMISE_20263 0x0D38 -#define PCI_DEVICE_ID_PROMISE_20268 0x4d68 -#define PCI_DEVICE_ID_PROMISE_20270 0x6268 -#define PCI_DEVICE_ID_PROMISE_20269 0x4d69 -#define PCI_DEVICE_ID_PROMISE_20271 0x6269 -#define PCI_DEVICE_ID_PROMISE_20275 0x1275 -#define PCI_DEVICE_ID_PROMISE_20276 0x5275 -#define PCI_DEVICE_ID_PROMISE_20277 0x7275 -#define PCI_DEVICE_ID_PROMISE_5300 0x5300 - -#define PCI_VENDOR_ID_N9 0x105d -#define PCI_DEVICE_ID_N9_I128 0x2309 -#define PCI_DEVICE_ID_N9_I128_2 0x2339 -#define PCI_DEVICE_ID_N9_I128_T2R 0x493d - -#define PCI_VENDOR_ID_UMC 0x1060 -#define PCI_DEVICE_ID_UMC_UM8673F 0x0101 -#define PCI_DEVICE_ID_UMC_UM8891A 0x0891 -#define PCI_DEVICE_ID_UMC_UM8886BF 0x673a -#define PCI_DEVICE_ID_UMC_UM8886A 0x886a -#define PCI_DEVICE_ID_UMC_UM8881F 0x8881 -#define PCI_DEVICE_ID_UMC_UM8886F 0x8886 -#define PCI_DEVICE_ID_UMC_UM9017F 0x9017 -#define PCI_DEVICE_ID_UMC_UM8886N 0xe886 -#define PCI_DEVICE_ID_UMC_UM8891N 0xe891 - -#define PCI_VENDOR_ID_X 0x1061 -#define PCI_DEVICE_ID_X_AGX016 0x0001 - -#define PCI_VENDOR_ID_MYLEX 0x1069 -#define PCI_DEVICE_ID_MYLEX_DAC960_P 0x0001 -#define PCI_DEVICE_ID_MYLEX_DAC960_PD 0x0002 -#define PCI_DEVICE_ID_MYLEX_DAC960_PG 0x0010 -#define PCI_DEVICE_ID_MYLEX_DAC960_LA 0x0020 -#define PCI_DEVICE_ID_MYLEX_DAC960_LP 0x0050 -#define PCI_DEVICE_ID_MYLEX_DAC960_BA 0xBA56 - -#define PCI_VENDOR_ID_PICOP 0x1066 -#define PCI_DEVICE_ID_PICOP_PT86C52X 0x0001 -#define PCI_DEVICE_ID_PICOP_PT80C524 0x8002 - -#define PCI_VENDOR_ID_APPLE 0x106b -#define PCI_DEVICE_ID_APPLE_BANDIT 0x0001 -#define PCI_DEVICE_ID_APPLE_GC 0x0002 -#define PCI_DEVICE_ID_APPLE_HYDRA 0x000e -#define PCI_DEVICE_ID_APPLE_UNI_N_FW 0x0018 -#define PCI_DEVICE_ID_APPLE_KL_USB 0x0019 -#define PCI_DEVICE_ID_APPLE_UNI_N_AGP 0x0020 -#define PCI_DEVICE_ID_APPLE_UNI_N_GMAC 0x0021 -#define PCI_DEVICE_ID_APPLE_KEYLARGO 0x0022 -#define PCI_DEVICE_ID_APPLE_UNI_N_GMACP 0x0024 -#define PCI_DEVICE_ID_APPLE_KEYLARGO_P 0x0025 -#define PCI_DEVICE_ID_APPLE_KL_USB_P 0x0026 -#define PCI_DEVICE_ID_APPLE_UNI_N_AGP_P 0x0027 -#define PCI_DEVICE_ID_APPLE_UNI_N_AGP15 0x002d -#define PCI_DEVICE_ID_APPLE_UNI_N_FW2 0x0030 - -#define PCI_VENDOR_ID_YAMAHA 0x1073 -#define PCI_DEVICE_ID_YAMAHA_724 0x0004 -#define PCI_DEVICE_ID_YAMAHA_724F 0x000d -#define PCI_DEVICE_ID_YAMAHA_740 0x000a -#define PCI_DEVICE_ID_YAMAHA_740C 0x000c -#define PCI_DEVICE_ID_YAMAHA_744 0x0010 -#define PCI_DEVICE_ID_YAMAHA_754 0x0012 - -#define PCI_VENDOR_ID_NEXGEN 0x1074 -#define PCI_DEVICE_ID_NEXGEN_82C501 0x4e78 - -#define PCI_VENDOR_ID_QLOGIC 0x1077 -#define PCI_DEVICE_ID_QLOGIC_ISP1020 0x1020 -#define PCI_DEVICE_ID_QLOGIC_ISP1022 0x1022 -#define PCI_DEVICE_ID_QLOGIC_ISP2100 0x2100 -#define PCI_DEVICE_ID_QLOGIC_ISP2200 0x2200 - -#define PCI_VENDOR_ID_CYRIX 0x1078 -#define PCI_DEVICE_ID_CYRIX_5510 0x0000 -#define PCI_DEVICE_ID_CYRIX_PCI_MASTER 0x0001 -#define PCI_DEVICE_ID_CYRIX_5520 0x0002 -#define PCI_DEVICE_ID_CYRIX_5530_LEGACY 0x0100 -#define PCI_DEVICE_ID_CYRIX_5530_SMI 0x0101 -#define PCI_DEVICE_ID_CYRIX_5530_IDE 0x0102 -#define PCI_DEVICE_ID_CYRIX_5530_AUDIO 0x0103 -#define PCI_DEVICE_ID_CYRIX_5530_VIDEO 0x0104 - -#define PCI_VENDOR_ID_LEADTEK 0x107d -#define PCI_DEVICE_ID_LEADTEK_805 0x0000 - -#define PCI_VENDOR_ID_INTERPHASE 0x107e -#define PCI_DEVICE_ID_INTERPHASE_5526 0x0004 -#define PCI_DEVICE_ID_INTERPHASE_55x6 0x0005 -#define PCI_DEVICE_ID_INTERPHASE_5575 0x0008 - -#define PCI_VENDOR_ID_CONTAQ 0x1080 -#define PCI_DEVICE_ID_CONTAQ_82C599 0x0600 -#define PCI_DEVICE_ID_CONTAQ_82C693 0xc693 - -#define PCI_VENDOR_ID_FOREX 0x1083 - -#define PCI_VENDOR_ID_OLICOM 0x108d -#define PCI_DEVICE_ID_OLICOM_OC3136 0x0001 -#define PCI_DEVICE_ID_OLICOM_OC2315 0x0011 -#define PCI_DEVICE_ID_OLICOM_OC2325 0x0012 -#define PCI_DEVICE_ID_OLICOM_OC2183 0x0013 -#define PCI_DEVICE_ID_OLICOM_OC2326 0x0014 -#define PCI_DEVICE_ID_OLICOM_OC6151 0x0021 - -#define PCI_VENDOR_ID_SUN 0x108e -#define PCI_DEVICE_ID_SUN_EBUS 0x1000 -#define PCI_DEVICE_ID_SUN_HAPPYMEAL 0x1001 -#define PCI_DEVICE_ID_SUN_RIO_EBUS 0x1100 -#define PCI_DEVICE_ID_SUN_RIO_GEM 0x1101 -#define PCI_DEVICE_ID_SUN_RIO_1394 0x1102 -#define PCI_DEVICE_ID_SUN_RIO_USB 0x1103 -#define PCI_DEVICE_ID_SUN_GEM 0x2bad -#define PCI_DEVICE_ID_SUN_SIMBA 0x5000 -#define PCI_DEVICE_ID_SUN_PBM 0x8000 -#define PCI_DEVICE_ID_SUN_SCHIZO 0x8001 -#define PCI_DEVICE_ID_SUN_SABRE 0xa000 -#define PCI_DEVICE_ID_SUN_HUMMINGBIRD 0xa001 - -#define PCI_VENDOR_ID_CMD 0x1095 -#define PCI_DEVICE_ID_CMD_640 0x0640 -#define PCI_DEVICE_ID_CMD_643 0x0643 -#define PCI_DEVICE_ID_CMD_646 0x0646 -#define PCI_DEVICE_ID_CMD_647 0x0647 -#define PCI_DEVICE_ID_CMD_648 0x0648 -#define PCI_DEVICE_ID_CMD_649 0x0649 -#define PCI_DEVICE_ID_CMD_670 0x0670 - -#define PCI_DEVICE_ID_SII_680 0x0680 -#define PCI_DEVICE_ID_SII_3112 0x3112 - -#define PCI_VENDOR_ID_VISION 0x1098 -#define PCI_DEVICE_ID_VISION_QD8500 0x0001 -#define PCI_DEVICE_ID_VISION_QD8580 0x0002 - -#define PCI_VENDOR_ID_BROOKTREE 0x109e -#define PCI_DEVICE_ID_BROOKTREE_848 0x0350 -#define PCI_DEVICE_ID_BROOKTREE_849A 0x0351 -#define PCI_DEVICE_ID_BROOKTREE_878_1 0x036e -#define PCI_DEVICE_ID_BROOKTREE_878 0x0878 -#define PCI_DEVICE_ID_BROOKTREE_8474 0x8474 - -#define PCI_VENDOR_ID_SIERRA 0x10a8 -#define PCI_DEVICE_ID_SIERRA_STB 0x0000 - -#define PCI_VENDOR_ID_SGI 0x10a9 -#define PCI_DEVICE_ID_SGI_IOC3 0x0003 - -#define PCI_VENDOR_ID_ACC 0x10aa -#define PCI_DEVICE_ID_ACC_2056 0x0000 - -#define PCI_VENDOR_ID_WINBOND 0x10ad -#define PCI_DEVICE_ID_WINBOND_83769 0x0001 -#define PCI_DEVICE_ID_WINBOND_82C105 0x0105 -#define PCI_DEVICE_ID_WINBOND_83C553 0x0565 - -#define PCI_VENDOR_ID_DATABOOK 0x10b3 -#define PCI_DEVICE_ID_DATABOOK_87144 0xb106 - -#define PCI_VENDOR_ID_PLX 0x10b5 -#define PCI_DEVICE_ID_PLX_R685 0x1030 -#define PCI_DEVICE_ID_PLX_ROMULUS 0x106a -#define PCI_DEVICE_ID_PLX_SPCOM800 0x1076 -#define PCI_DEVICE_ID_PLX_1077 0x1077 -#define PCI_DEVICE_ID_PLX_SPCOM200 0x1103 -#define PCI_DEVICE_ID_PLX_DJINN_ITOO 0x1151 -#define PCI_DEVICE_ID_PLX_R753 0x1152 -#define PCI_DEVICE_ID_PLX_9050 0x9050 -#define PCI_DEVICE_ID_PLX_9060 0x9060 -#define PCI_DEVICE_ID_PLX_9060ES 0x906E -#define PCI_DEVICE_ID_PLX_9060SD 0x906D -#define PCI_DEVICE_ID_PLX_9080 0x9080 -#define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001 - -#define PCI_VENDOR_ID_MADGE 0x10b6 -#define PCI_DEVICE_ID_MADGE_MK2 0x0002 -#define PCI_DEVICE_ID_MADGE_C155S 0x1001 - -#define PCI_VENDOR_ID_3COM 0x10b7 -#define PCI_DEVICE_ID_3COM_3C985 0x0001 -#define PCI_DEVICE_ID_3COM_3C339 0x3390 -#define PCI_DEVICE_ID_3COM_3C590 0x5900 -#define PCI_DEVICE_ID_3COM_3C595TX 0x5950 -#define PCI_DEVICE_ID_3COM_3C595T4 0x5951 -#define PCI_DEVICE_ID_3COM_3C595MII 0x5952 -#define PCI_DEVICE_ID_3COM_3C900TPO 0x9000 -#define PCI_DEVICE_ID_3COM_3C900COMBO 0x9001 -#define PCI_DEVICE_ID_3COM_3C905TX 0x9050 -#define PCI_DEVICE_ID_3COM_3C905T4 0x9051 -#define PCI_DEVICE_ID_3COM_3C905B_TX 0x9055 -#define PCI_DEVICE_ID_3COM_3CR990 0x9900 -#define PCI_DEVICE_ID_3COM_3CR990_TX_95 0x9902 -#define PCI_DEVICE_ID_3COM_3CR990_TX_97 0x9903 -#define PCI_DEVICE_ID_3COM_3CR990B 0x9904 -#define PCI_DEVICE_ID_3COM_3CR990_FX 0x9905 -#define PCI_DEVICE_ID_3COM_3CR990SVR95 0x9908 -#define PCI_DEVICE_ID_3COM_3CR990SVR97 0x9909 -#define PCI_DEVICE_ID_3COM_3CR990SVR 0x990a - -#define PCI_VENDOR_ID_SMC 0x10b8 -#define PCI_DEVICE_ID_SMC_EPIC100 0x0005 - -#define PCI_VENDOR_ID_AL 0x10b9 -#define PCI_DEVICE_ID_AL_M1445 0x1445 -#define PCI_DEVICE_ID_AL_M1449 0x1449 -#define PCI_DEVICE_ID_AL_M1451 0x1451 -#define PCI_DEVICE_ID_AL_M1461 0x1461 -#define PCI_DEVICE_ID_AL_M1489 0x1489 -#define PCI_DEVICE_ID_AL_M1511 0x1511 -#define PCI_DEVICE_ID_AL_M1513 0x1513 -#define PCI_DEVICE_ID_AL_M1521 0x1521 -#define PCI_DEVICE_ID_AL_M1523 0x1523 -#define PCI_DEVICE_ID_AL_M1531 0x1531 -#define PCI_DEVICE_ID_AL_M1533 0x1533 -#define PCI_DEVICE_ID_AL_M1535 0x1535 -#define PCI_DEVICE_ID_AL_M1541 0x1541 -#define PCI_DEVICE_ID_AL_M1621 0x1621 -#define PCI_DEVICE_ID_AL_M1631 0x1631 -#define PCI_DEVICE_ID_AL_M1641 0x1641 -#define PCI_DEVICE_ID_AL_M1644 0x1644 -#define PCI_DEVICE_ID_AL_M1647 0x1647 -#define PCI_DEVICE_ID_AL_M1651 0x1651 -#define PCI_DEVICE_ID_AL_M1543 0x1543 -#define PCI_DEVICE_ID_AL_M3307 0x3307 -#define PCI_DEVICE_ID_AL_M4803 0x5215 -#define PCI_DEVICE_ID_AL_M5219 0x5219 -#define PCI_DEVICE_ID_AL_M5229 0x5229 -#define PCI_DEVICE_ID_AL_M5237 0x5237 -#define PCI_DEVICE_ID_AL_M5243 0x5243 -#define PCI_DEVICE_ID_AL_M5451 0x5451 -#define PCI_DEVICE_ID_AL_M7101 0x7101 - -#define PCI_VENDOR_ID_MITSUBISHI 0x10ba - -#define PCI_VENDOR_ID_SURECOM 0x10bd -#define PCI_DEVICE_ID_SURECOM_NE34 0x0e34 - -#define PCI_VENDOR_ID_NEOMAGIC 0x10c8 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICGRAPH_NM2070 0x0001 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICGRAPH_128V 0x0002 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICGRAPH_128ZV 0x0003 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICGRAPH_NM2160 0x0004 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICMEDIA_256AV 0x0005 -#define PCI_DEVICE_ID_NEOMAGIC_MAGICGRAPH_128ZVPLUS 0x0083 - -#define PCI_VENDOR_ID_ASP 0x10cd -#define PCI_DEVICE_ID_ASP_ABP940 0x1200 -#define PCI_DEVICE_ID_ASP_ABP940U 0x1300 -#define PCI_DEVICE_ID_ASP_ABP940UW 0x2300 - -#define PCI_VENDOR_ID_MACRONIX 0x10d9 -#define PCI_DEVICE_ID_MACRONIX_MX98713 0x0512 -#define PCI_DEVICE_ID_MACRONIX_MX987x5 0x0531 - -#define PCI_VENDOR_ID_TCONRAD 0x10da -#define PCI_DEVICE_ID_TCONRAD_TOKENRING 0x0508 - -#define PCI_VENDOR_ID_CERN 0x10dc -#define PCI_DEVICE_ID_CERN_SPSB_PMC 0x0001 -#define PCI_DEVICE_ID_CERN_SPSB_PCI 0x0002 -#define PCI_DEVICE_ID_CERN_HIPPI_DST 0x0021 -#define PCI_DEVICE_ID_CERN_HIPPI_SRC 0x0022 - -#define PCI_VENDOR_ID_NVIDIA 0x10de -#define PCI_DEVICE_ID_NVIDIA_TNT 0x0020 -#define PCI_DEVICE_ID_NVIDIA_TNT2 0x0028 -#define PCI_DEVICE_ID_NVIDIA_UTNT2 0x0029 -#define PCI_DEVICE_ID_NVIDIA_VTNT2 0x002C -#define PCI_DEVICE_ID_NVIDIA_UVTNT2 0x002D -#define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065 -#define PCI_DEVICE_ID_NVIDIA_ITNT2 0x00A0 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR 0x0100 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR 0x0101 -#define PCI_DEVICE_ID_NVIDIA_QUADRO 0x0103 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX 0x0110 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2 0x0111 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO 0x0112 -#define PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR 0x0113 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS 0x0150 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2 0x0151 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA 0x0152 -#define PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO 0x0153 -#define PCI_DEVICE_ID_NVIDIA_IGEFORCE2 0x01a0 -#define PCI_DEVICE_ID_NVIDIA_NFORCE_IDE 0x01bc -#define PCI_DEVICE_ID_NVIDIA_GEFORCE3 0x0200 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE3_1 0x0201 -#define PCI_DEVICE_ID_NVIDIA_GEFORCE3_2 0x0202 -#define PCI_DEVICE_ID_NVIDIA_QUADRO_DDC 0x0203 - -#define PCI_VENDOR_ID_IMS 0x10e0 -#define PCI_DEVICE_ID_IMS_8849 0x8849 -#define PCI_DEVICE_ID_IMS_TT128 0x9128 -#define PCI_DEVICE_ID_IMS_TT3D 0x9135 - -#define PCI_VENDOR_ID_TEKRAM2 0x10e1 -#define PCI_DEVICE_ID_TEKRAM2_690c 0x690c - -#define PCI_VENDOR_ID_TUNDRA 0x10e3 -#define PCI_DEVICE_ID_TUNDRA_CA91C042 0x0000 - -#define PCI_VENDOR_ID_AMCC 0x10e8 -#define PCI_DEVICE_ID_AMCC_MYRINET 0x8043 -#define PCI_DEVICE_ID_AMCC_PARASTATION 0x8062 -#define PCI_DEVICE_ID_AMCC_S5933 0x807d -#define PCI_DEVICE_ID_AMCC_S5933_HEPC3 0x809c - -#define PCI_VENDOR_ID_INTERG 0x10ea -#define PCI_DEVICE_ID_INTERG_1680 0x1680 -#define PCI_DEVICE_ID_INTERG_1682 0x1682 -#define PCI_DEVICE_ID_INTERG_2000 0x2000 -#define PCI_DEVICE_ID_INTERG_2010 0x2010 -#define PCI_DEVICE_ID_INTERG_5000 0x5000 -#define PCI_DEVICE_ID_INTERG_5050 0x5050 - -#define PCI_VENDOR_ID_REALTEK 0x10ec -#define PCI_DEVICE_ID_REALTEK_8029 0x8029 -#define PCI_DEVICE_ID_REALTEK_8129 0x8129 -#define PCI_DEVICE_ID_REALTEK_8139 0x8139 -#define PCI_DEVICE_ID_REALTEK_8169 0x8169 - -#define PCI_VENDOR_ID_XILINX 0x10ee -#define PCI_DEVICE_ID_TURBOPAM 0x4020 - -#define PCI_VENDOR_ID_TRUEVISION 0x10fa -#define PCI_DEVICE_ID_TRUEVISION_T1000 0x000c - -#define PCI_VENDOR_ID_INIT 0x1101 -#define PCI_DEVICE_ID_INIT_320P 0x9100 -#define PCI_DEVICE_ID_INIT_360P 0x9500 - -#define PCI_VENDOR_ID_CREATIVE 0x1102 // duplicate: ECTIVA -#define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002 - -#define PCI_VENDOR_ID_ECTIVA 0x1102 // duplicate: CREATIVE -#define PCI_DEVICE_ID_ECTIVA_EV1938 0x8938 - -#define PCI_VENDOR_ID_TTI 0x1103 -#define PCI_DEVICE_ID_TTI_HPT343 0x0003 -#define PCI_DEVICE_ID_TTI_HPT366 0x0004 -#define PCI_DEVICE_ID_TTI_HPT372 0x0005 -#define PCI_DEVICE_ID_TTI_HPT302 0x0006 -#define PCI_DEVICE_ID_TTI_HPT371 0x0007 -#define PCI_DEVICE_ID_TTI_HPT374 0x0008 -#define PCI_DEVICE_ID_TTI_HPT372N 0x0009 // appoarently a 372N variant? - -#define PCI_VENDOR_ID_VIA 0x1106 -#define PCI_DEVICE_ID_VIA_8363_0 0x0305 -#define PCI_DEVICE_ID_VIA_8371_0 0x0391 -#define PCI_DEVICE_ID_VIA_8501_0 0x0501 -#define PCI_DEVICE_ID_VIA_82C505 0x0505 -#define PCI_DEVICE_ID_VIA_82C561 0x0561 -#define PCI_DEVICE_ID_VIA_82C586_1 0x0571 -#define PCI_DEVICE_ID_VIA_82C576 0x0576 -#define PCI_DEVICE_ID_VIA_82C585 0x0585 -#define PCI_DEVICE_ID_VIA_82C586_0 0x0586 -#define PCI_DEVICE_ID_VIA_82C595 0x0595 -#define PCI_DEVICE_ID_VIA_82C596 0x0596 -#define PCI_DEVICE_ID_VIA_82C597_0 0x0597 -#define PCI_DEVICE_ID_VIA_82C598_0 0x0598 -#define PCI_DEVICE_ID_VIA_8601_0 0x0601 -#define PCI_DEVICE_ID_VIA_8605_0 0x0605 -#define PCI_DEVICE_ID_VIA_82C680 0x0680 -#define PCI_DEVICE_ID_VIA_82C686 0x0686 -#define PCI_DEVICE_ID_VIA_82C691 0x0691 -#define PCI_DEVICE_ID_VIA_82C693 0x0693 -#define PCI_DEVICE_ID_VIA_82C693_1 0x0698 -#define PCI_DEVICE_ID_VIA_82C926 0x0926 -#define PCI_DEVICE_ID_VIA_82C576_1 0x1571 -#define PCI_DEVICE_ID_VIA_82C595_97 0x1595 -#define PCI_DEVICE_ID_VIA_82C586_2 0x3038 -#define PCI_DEVICE_ID_VIA_82C586_3 0x3040 -#define PCI_DEVICE_ID_VIA_6305 0x3044 -#define PCI_DEVICE_ID_VIA_82C596_3 0x3050 -#define PCI_DEVICE_ID_VIA_82C596B_3 0x3051 -#define PCI_DEVICE_ID_VIA_82C686_4 0x3057 -#define PCI_DEVICE_ID_VIA_82C686_5 0x3058 -#define PCI_DEVICE_ID_VIA_8233_5 0x3059 -#define PCI_DEVICE_ID_VIA_8233_7 0x3065 -#define PCI_DEVICE_ID_VIA_82C686_6 0x3068 -#define PCI_DEVICE_ID_VIA_8233_0 0x3074 -#define PCI_DEVICE_ID_VIA_8633_0 0x3091 -#define PCI_DEVICE_ID_VIA_8367_0 0x3099 -#define PCI_DEVICE_ID_VIA_8622 0x3102 -#define PCI_DEVICE_ID_VIA_8233C_0 0x3109 -#define PCI_DEVICE_ID_VIA_8361 0x3112 -#define PCI_DEVICE_ID_VIA_8375 0x3116 -#define PCI_DEVICE_ID_VIA_8233A 0x3147 -#define PCI_DEVICE_ID_VIA_P4X333 0x3168 -#define PCI_DEVICE_ID_VIA_8235 0x3177 -#define PCI_DEVICE_ID_VIA_8377_0 0x3189 -#define PCI_DEVICE_ID_VIA_8377_0 0x3189 -#define PCI_DEVICE_ID_VIA_8237 0x3227 -#define PCI_DEVICE_ID_VIA_86C100A 0x6100 -#define PCI_DEVICE_ID_VIA_8231 0x8231 -#define PCI_DEVICE_ID_VIA_8231_4 0x8235 -#define PCI_DEVICE_ID_VIA_8365_1 0x8305 -#define PCI_DEVICE_ID_VIA_8371_1 0x8391 -#define PCI_DEVICE_ID_VIA_8501_1 0x8501 -#define PCI_DEVICE_ID_VIA_82C597_1 0x8597 -#define PCI_DEVICE_ID_VIA_82C598_1 0x8598 -#define PCI_DEVICE_ID_VIA_8601_1 0x8601 -#define PCI_DEVICE_ID_VIA_8505_1 0x8605 -#define PCI_DEVICE_ID_VIA_8633_1 0xB091 -#define PCI_DEVICE_ID_VIA_8367_1 0xB099 - -#define PCI_VENDOR_ID_SIEMENS 0x110A -#define PCI_DEVICE_ID_SIEMENS_DSCC4 0x2102 - -#define PCI_VENDOR_ID_SMC2 0x1113 -#define PCI_DEVICE_ID_SMC2_1211TX 0x1211 - -#define PCI_VENDOR_ID_VORTEX 0x1119 -#define PCI_DEVICE_ID_VORTEX_GDT60x0 0x0000 -#define PCI_DEVICE_ID_VORTEX_GDT6000B 0x0001 -#define PCI_DEVICE_ID_VORTEX_GDT6x10 0x0002 -#define PCI_DEVICE_ID_VORTEX_GDT6x20 0x0003 -#define PCI_DEVICE_ID_VORTEX_GDT6530 0x0004 -#define PCI_DEVICE_ID_VORTEX_GDT6550 0x0005 -#define PCI_DEVICE_ID_VORTEX_GDT6x17 0x0006 -#define PCI_DEVICE_ID_VORTEX_GDT6x27 0x0007 -#define PCI_DEVICE_ID_VORTEX_GDT6537 0x0008 -#define PCI_DEVICE_ID_VORTEX_GDT6557 0x0009 -#define PCI_DEVICE_ID_VORTEX_GDT6x15 0x000a -#define PCI_DEVICE_ID_VORTEX_GDT6x25 0x000b -#define PCI_DEVICE_ID_VORTEX_GDT6535 0x000c -#define PCI_DEVICE_ID_VORTEX_GDT6555 0x000d -#define PCI_DEVICE_ID_VORTEX_GDT6x17RP 0x0100 -#define PCI_DEVICE_ID_VORTEX_GDT6x27RP 0x0101 -#define PCI_DEVICE_ID_VORTEX_GDT6537RP 0x0102 -#define PCI_DEVICE_ID_VORTEX_GDT6557RP 0x0103 -#define PCI_DEVICE_ID_VORTEX_GDT6x11RP 0x0104 -#define PCI_DEVICE_ID_VORTEX_GDT6x21RP 0x0105 -#define PCI_DEVICE_ID_VORTEX_GDT6x17RP1 0x0110 -#define PCI_DEVICE_ID_VORTEX_GDT6x27RP1 0x0111 -#define PCI_DEVICE_ID_VORTEX_GDT6537RP1 0x0112 -#define PCI_DEVICE_ID_VORTEX_GDT6557RP1 0x0113 -#define PCI_DEVICE_ID_VORTEX_GDT6x11RP1 0x0114 -#define PCI_DEVICE_ID_VORTEX_GDT6x21RP1 0x0115 -#define PCI_DEVICE_ID_VORTEX_GDT6x17RP2 0x0120 -#define PCI_DEVICE_ID_VORTEX_GDT6x27RP2 0x0121 -#define PCI_DEVICE_ID_VORTEX_GDT6537RP2 0x0122 -#define PCI_DEVICE_ID_VORTEX_GDT6557RP2 0x0123 -#define PCI_DEVICE_ID_VORTEX_GDT6x11RP2 0x0124 -#define PCI_DEVICE_ID_VORTEX_GDT6x21RP2 0x0125 - -#define PCI_VENDOR_ID_EF 0x111a -#define PCI_DEVICE_ID_EF_ATM_FPGA 0x0000 -#define PCI_DEVICE_ID_EF_ATM_ASIC 0x0002 - -#define PCI_VENDOR_ID_IDT 0x111d -#define PCI_DEVICE_ID_IDT_IDT77201 0x0001 - -#define PCI_VENDOR_ID_FORE 0x1127 -#define PCI_DEVICE_ID_FORE_PCA200PC 0x0210 -#define PCI_DEVICE_ID_FORE_PCA200E 0x0300 - -#define PCI_VENDOR_ID_IMAGINGTECH 0x112f -#define PCI_DEVICE_ID_IMAGINGTECH_ICPCI 0x0000 - -#define PCI_VENDOR_ID_PHILIPS 0x1131 -#define PCI_DEVICE_ID_PHILIPS_SAA7145 0x7145 -#define PCI_DEVICE_ID_PHILIPS_SAA7146 0x7146 -#define PCI_DEVICE_ID_PHILIPS_SAA9730 0x9730 - -#define PCI_VENDOR_ID_EICON 0x1133 -#define PCI_DEVICE_ID_EICON_DIVA20PRO 0xe001 -#define PCI_DEVICE_ID_EICON_DIVA20 0xe002 -#define PCI_DEVICE_ID_EICON_DIVA20PRO_U 0xe003 -#define PCI_DEVICE_ID_EICON_DIVA20_U 0xe004 -#define PCI_DEVICE_ID_EICON_DIVA201 0xe005 -#define PCI_DEVICE_ID_EICON_DIVA202 0xe00b -#define PCI_DEVICE_ID_EICON_MAESTRA 0xe010 -#define PCI_DEVICE_ID_EICON_MAESTRAQ 0xe012 -#define PCI_DEVICE_ID_EICON_MAESTRAQ_U 0xe013 -#define PCI_DEVICE_ID_EICON_MAESTRAP 0xe014 - -#define PCI_VENDOR_ID_CYCLONE 0x113c -#define PCI_DEVICE_ID_CYCLONE_SDK 0x0001 - -#define PCI_VENDOR_ID_ALLIANCE 0x1142 -#define PCI_DEVICE_ID_ALLIANCE_PROMOTIO 0x3210 -#define PCI_DEVICE_ID_ALLIANCE_PROVIDEO 0x6422 -#define PCI_DEVICE_ID_ALLIANCE_AT24 0x6424 -#define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d - -#define PCI_VENDOR_ID_SYSKONNECT 0x1148 -#define PCI_DEVICE_ID_SYSKONNECT_FP 0x4000 -#define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 -#define PCI_DEVICE_ID_SYSKONNECT_GE 0x4300 -#define PCI_DEVICE_ID_SYSKONNECT_YU 0x4320 - -#define PCI_VENDOR_ID_VMIC 0x114a -#define PCI_DEVICE_ID_VMIC_VME 0x7587 - -#define PCI_VENDOR_ID_DIGI 0x114f -#define PCI_DEVICE_ID_DIGI_EPC 0x0002 -#define PCI_DEVICE_ID_DIGI_RIGHTSWITCH 0x0003 -#define PCI_DEVICE_ID_DIGI_XEM 0x0004 -#define PCI_DEVICE_ID_DIGI_XR 0x0005 -#define PCI_DEVICE_ID_DIGI_CX 0x0006 -#define PCI_DEVICE_ID_DIGI_XRJ 0x0009 -#define PCI_DEVICE_ID_DIGI_EPCJ 0x000a -#define PCI_DEVICE_ID_DIGI_XR_920 0x0027 -#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_E 0x0070 -#define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071 -#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072 -#define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073 - -#define PCI_VENDOR_ID_MUTECH 0x1159 -#define PCI_DEVICE_ID_MUTECH_MV1000 0x0001 - -#define PCI_VENDOR_ID_XIRCOM 0x115d -#define PCI_DEVICE_ID_XIRCOM_X3201_ETH 0x0003 -#define PCI_DEVICE_ID_XIRCOM_X3201_MDM 0x0103 - -#define PCI_VENDOR_ID_RENDITION 0x1163 -#define PCI_DEVICE_ID_RENDITION_VERITE 0x0001 -#define PCI_DEVICE_ID_RENDITION_VERITE2100 0x2000 - -#define PCI_VENDOR_ID_SERVERWORKS 0x1166 -#define PCI_DEVICE_ID_SERVERWORKS_HE 0x0008 -#define PCI_DEVICE_ID_SERVERWORKS_LE 0x0009 -#define PCI_DEVICE_ID_SERVERWORKS_CIOB30 0x0010 -#define PCI_DEVICE_ID_SERVERWORKS_CMIC_HE 0x0011 -#define PCI_DEVICE_ID_SERVERWORKS_GCNB_LE 0x0017 -#define PCI_DEVICE_ID_SERVERWORKS_OSB4 0x0200 -#define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201 -#define PCI_DEVICE_ID_SERVERWORKS_CSB6 0x0203 -#define PCI_DEVICE_ID_SERVERWORKS_OSB4IDE 0x0211 -#define PCI_DEVICE_ID_SERVERWORKS_CSB5IDE 0x0212 -#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE 0x0213 -#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217 -#define PCI_DEVICE_ID_SERVERWORKS_OSB4USB 0x0220 -#define PCI_DEVICE_ID_SERVERWORKS_CSB5USB PCI_DEVICE_ID_SERVERWORKS_OSB4USB -#define PCI_DEVICE_ID_SERVERWORKS_CSB6USB 0x0221 -#define PCI_DEVICE_ID_SERVERWORKS_GCLE 0x0225 -#define PCI_DEVICE_ID_SERVERWORKS_GCLE2 0x0227 -#define PCI_DEVICE_ID_SERVERWORKS_CSB5ISA 0x0230 - -#define PCI_VENDOR_ID_SBE 0x1176 -#define PCI_DEVICE_ID_SBE_WANXL100 0x0301 -#define PCI_DEVICE_ID_SBE_WANXL200 0x0302 -#define PCI_DEVICE_ID_SBE_WANXL400 0x0104 - -#define PCI_VENDOR_ID_TOSHIBA 0x1179 -#define PCI_DEVICE_ID_TOSHIBA_601 0x0601 -#define PCI_DEVICE_ID_TOSHIBA_TOPIC95 0x060a -#define PCI_DEVICE_ID_TOSHIBA_TOPIC97 0x060f - -#define PCI_VENDOR_ID_TOSHIBA_2 0x102f -#define PCI_DEVICE_ID_TOSHIBA_TX3927 0x000a -#define PCI_DEVICE_ID_TOSHIBA_TC35815CF 0x0030 -#define PCI_DEVICE_ID_TOSHIBA_TX4927 0x0180 - -#define PCI_VENDOR_ID_RICOH 0x1180 -#define PCI_DEVICE_ID_RICOH_RL5C465 0x0465 -#define PCI_DEVICE_ID_RICOH_RL5C466 0x0466 -#define PCI_DEVICE_ID_RICOH_RL5C475 0x0475 -#define PCI_DEVICE_ID_RICOH_RL5C476 0x0476 -#define PCI_DEVICE_ID_RICOH_RL5C478 0x0478 - -#define PCI_VENDOR_ID_ARTOP 0x1191 -#define PCI_DEVICE_ID_ARTOP_ATP8400 0x0004 -#define PCI_DEVICE_ID_ARTOP_ATP850UF 0x0005 -#define PCI_DEVICE_ID_ARTOP_ATP860 0x0006 -#define PCI_DEVICE_ID_ARTOP_ATP860R 0x0007 -#define PCI_DEVICE_ID_ARTOP_ATP865 0x0008 -#define PCI_DEVICE_ID_ARTOP_ATP865R 0x0009 -#define PCI_DEVICE_ID_ARTOP_AEC7610 0x8002 -#define PCI_DEVICE_ID_ARTOP_AEC7612UW 0x8010 -#define PCI_DEVICE_ID_ARTOP_AEC7612U 0x8020 -#define PCI_DEVICE_ID_ARTOP_AEC7612S 0x8030 -#define PCI_DEVICE_ID_ARTOP_AEC7612D 0x8040 -#define PCI_DEVICE_ID_ARTOP_AEC7612SUW 0x8050 -#define PCI_DEVICE_ID_ARTOP_8060 0x8060 - -#define PCI_VENDOR_ID_ZEITNET 0x1193 -#define PCI_DEVICE_ID_ZEITNET_1221 0x0001 -#define PCI_DEVICE_ID_ZEITNET_1225 0x0002 - -#define PCI_VENDOR_ID_OMEGA 0x119b -#define PCI_DEVICE_ID_OMEGA_82C092G 0x1221 - -#define PCI_VENDOR_ID_FUJITSU_ME 0x119e -#define PCI_DEVICE_ID_FUJITSU_FS155 0x0001 -#define PCI_DEVICE_ID_FUJITSU_FS50 0x0003 - -#define PCI_SUBVENDOR_ID_KEYSPAN 0x11a9 -#define PCI_SUBDEVICE_ID_KEYSPAN_SX2 0x5334 - -#define PCI_VENDOR_ID_GALILEO 0x11ab -#define PCI_DEVICE_ID_GALILEO_GT64011 0x4146 -#define PCI_DEVICE_ID_GALILEO_GT64111 0x4146 -#define PCI_DEVICE_ID_GALILEO_GT96100 0x9652 -#define PCI_DEVICE_ID_GALILEO_GT96100A 0x9653 - -#define PCI_VENDOR_ID_LITEON 0x11ad -#define PCI_DEVICE_ID_LITEON_LNE100TX 0x0002 - -#define PCI_VENDOR_ID_V3 0x11b0 -#define PCI_DEVICE_ID_V3_V960 0x0001 -#define PCI_DEVICE_ID_V3_V350 0x0001 -#define PCI_DEVICE_ID_V3_V961 0x0002 -#define PCI_DEVICE_ID_V3_V351 0x0002 - -#define PCI_VENDOR_ID_NP 0x11bc -#define PCI_DEVICE_ID_NP_PCI_FDDI 0x0001 - -#define PCI_VENDOR_ID_ATT 0x11c1 -#define PCI_DEVICE_ID_ATT_L56XMF 0x0440 -#define PCI_DEVICE_ID_ATT_VENUS_MODEM 0x480 - -#define PCI_VENDOR_ID_SPECIALIX 0x11cb -#define PCI_DEVICE_ID_SPECIALIX_IO8 0x2000 -#define PCI_DEVICE_ID_SPECIALIX_XIO 0x4000 -#define PCI_DEVICE_ID_SPECIALIX_RIO 0x8000 -#define PCI_SUBDEVICE_ID_SPECIALIX_SPEED4 0xa004 - -#define PCI_VENDOR_ID_AURAVISION 0x11d1 -#define PCI_DEVICE_ID_AURAVISION_VXP524 0x01f7 - -#define PCI_VENDOR_ID_ANALOG_DEVICES 0x11d4 -#define PCI_DEVICE_ID_AD1889JS 0x1889 - -#define PCI_VENDOR_ID_IKON 0x11d5 -#define PCI_DEVICE_ID_IKON_10115 0x0115 -#define PCI_DEVICE_ID_IKON_10117 0x0117 - -#define PCI_VENDOR_ID_ZORAN 0x11de -#define PCI_DEVICE_ID_ZORAN_36057 0x6057 -#define PCI_DEVICE_ID_ZORAN_36120 0x6120 - -#define PCI_VENDOR_ID_KINETIC 0x11f4 -#define PCI_DEVICE_ID_KINETIC_2915 0x2915 - -#define PCI_VENDOR_ID_COMPEX 0x11f6 -#define PCI_DEVICE_ID_COMPEX_ENET100VG4 0x0112 -#define PCI_DEVICE_ID_COMPEX_RL2000 0x1401 - -#define PCI_VENDOR_ID_RP 0x11fe -#define PCI_DEVICE_ID_RP32INTF 0x0001 -#define PCI_DEVICE_ID_RP8INTF 0x0002 -#define PCI_DEVICE_ID_RP16INTF 0x0003 -#define PCI_DEVICE_ID_RP4QUAD 0x0004 -#define PCI_DEVICE_ID_RP8OCTA 0x0005 -#define PCI_DEVICE_ID_RP8J 0x0006 -#define PCI_DEVICE_ID_RPP4 0x000A -#define PCI_DEVICE_ID_RPP8 0x000B -#define PCI_DEVICE_ID_RP8M 0x000C - -#define PCI_VENDOR_ID_CYCLADES 0x120e -#define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 -#define PCI_DEVICE_ID_CYCLOM_Y_Hi 0x0101 -#define PCI_DEVICE_ID_CYCLOM_4Y_Lo 0x0102 -#define PCI_DEVICE_ID_CYCLOM_4Y_Hi 0x0103 -#define PCI_DEVICE_ID_CYCLOM_8Y_Lo 0x0104 -#define PCI_DEVICE_ID_CYCLOM_8Y_Hi 0x0105 -#define PCI_DEVICE_ID_CYCLOM_Z_Lo 0x0200 -#define PCI_DEVICE_ID_CYCLOM_Z_Hi 0x0201 -#define PCI_DEVICE_ID_PC300_RX_2 0x0300 -#define PCI_DEVICE_ID_PC300_RX_1 0x0301 -#define PCI_DEVICE_ID_PC300_TE_2 0x0310 -#define PCI_DEVICE_ID_PC300_TE_1 0x0311 - -#define PCI_VENDOR_ID_ESSENTIAL 0x120f -#define PCI_DEVICE_ID_ESSENTIAL_ROADRUNNER 0x0001 - -#define PCI_VENDOR_ID_O2 0x1217 -#define PCI_DEVICE_ID_O2_6729 0x6729 -#define PCI_DEVICE_ID_O2_6730 0x673a -#define PCI_DEVICE_ID_O2_6832 0x6832 -#define PCI_DEVICE_ID_O2_6836 0x6836 - -#define PCI_VENDOR_ID_3DFX 0x121a -#define PCI_DEVICE_ID_3DFX_VOODOO 0x0001 -#define PCI_DEVICE_ID_3DFX_VOODOO2 0x0002 -#define PCI_DEVICE_ID_3DFX_BANSHEE 0x0003 -#define PCI_DEVICE_ID_3DFX_VOODOO3 0x0005 - -#define PCI_VENDOR_ID_SIGMADES 0x1236 -#define PCI_DEVICE_ID_SIGMADES_6425 0x6401 - -#define PCI_VENDOR_ID_CCUBE 0x123f - -#define PCI_VENDOR_ID_AVM 0x1244 -#define PCI_DEVICE_ID_AVM_B1 0x0700 -#define PCI_DEVICE_ID_AVM_C4 0x0800 -#define PCI_DEVICE_ID_AVM_A1 0x0a00 -#define PCI_DEVICE_ID_AVM_A1_V2 0x0e00 -#define PCI_DEVICE_ID_AVM_C2 0x1100 -#define PCI_DEVICE_ID_AVM_T1 0x1200 - -#define PCI_VENDOR_ID_DIPIX 0x1246 - -#define PCI_VENDOR_ID_STALLION 0x124d -#define PCI_DEVICE_ID_STALLION_ECHPCI832 0x0000 -#define PCI_DEVICE_ID_STALLION_ECHPCI864 0x0002 -#define PCI_DEVICE_ID_STALLION_EIOPCI 0x0003 - -#define PCI_VENDOR_ID_OPTIBASE 0x1255 -#define PCI_DEVICE_ID_OPTIBASE_FORGE 0x1110 -#define PCI_DEVICE_ID_OPTIBASE_FUSION 0x1210 -#define PCI_DEVICE_ID_OPTIBASE_VPLEX 0x2110 -#define PCI_DEVICE_ID_OPTIBASE_VPLEXCC 0x2120 -#define PCI_DEVICE_ID_OPTIBASE_VQUEST 0x2130 - -#define PCI_VENDOR_ID_ESS 0x125d -#define PCI_DEVICE_ID_ESS_ESS1968 0x1968 -#define PCI_DEVICE_ID_ESS_AUDIOPCI 0x1969 -#define PCI_DEVICE_ID_ESS_ESS1978 0x1978 - -#define PCI_VENDOR_ID_SATSAGEM 0x1267 -#define PCI_DEVICE_ID_SATSAGEM_NICCY 0x1016 -#define PCI_DEVICE_ID_SATSAGEM_PCR2101 0x5352 -#define PCI_DEVICE_ID_SATSAGEM_TELSATTURBO 0x5a4b - -#define PCI_VENDOR_ID_HUGHES 0x1273 -#define PCI_DEVICE_ID_HUGHES_DIRECPC 0x0002 - -#define PCI_VENDOR_ID_ENSONIQ 0x1274 -#define PCI_DEVICE_ID_ENSONIQ_CT5880 0x5880 -#define PCI_DEVICE_ID_ENSONIQ_ES1370 0x5000 -#define PCI_DEVICE_ID_ENSONIQ_ES1371 0x1371 - -#define PCI_VENDOR_ID_ROCKWELL 0x127A - -#define PCI_VENDOR_ID_ITE 0x1283 -#define PCI_DEVICE_ID_ITE_IT8172G 0x8172 -#define PCI_DEVICE_ID_ITE_IT8172G_AUDIO 0x0801 -#define PCI_DEVICE_ID_ITE_8872 0x8872 - -#define PCI_DEVICE_ID_ITE_IT8330G_0 0xe886 - -/* formerly Platform Tech */ -#define PCI_VENDOR_ID_ESS_OLD 0x1285 -#define PCI_DEVICE_ID_ESS_ESS0100 0x0100 - -#define PCI_VENDOR_ID_ALTEON 0x12ae -#define PCI_DEVICE_ID_ALTEON_ACENIC 0x0001 - -#define PCI_VENDOR_ID_USR 0x12B9 - -#define PCI_SUBVENDOR_ID_CONNECT_TECH 0x12c4 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232 0x0001 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_232 0x0002 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_232 0x0003 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485 0x0004 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_4_4 0x0005 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485 0x0006 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH4_485_2_2 0x0007 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_485 0x0008 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_2_6 0x0009 -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH081101V1 0x000A -#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH041101V1 0x000B - -#define PCI_VENDOR_ID_PICTUREL 0x12c5 -#define PCI_DEVICE_ID_PICTUREL_PCIVST 0x0081 - -#define PCI_VENDOR_ID_NVIDIA_SGS 0x12d2 -#define PCI_DEVICE_ID_NVIDIA_SGS_RIVA128 0x0018 - -#define PCI_SUBVENDOR_ID_CHASE_PCIFAST 0x12E0 -#define PCI_SUBDEVICE_ID_CHASE_PCIFAST4 0x0031 -#define PCI_SUBDEVICE_ID_CHASE_PCIFAST8 0x0021 -#define PCI_SUBDEVICE_ID_CHASE_PCIFAST16 0x0011 -#define PCI_SUBDEVICE_ID_CHASE_PCIFAST16FMC 0x0041 -#define PCI_SUBVENDOR_ID_CHASE_PCIRAS 0x124D -#define PCI_SUBDEVICE_ID_CHASE_PCIRAS4 0xF001 -#define PCI_SUBDEVICE_ID_CHASE_PCIRAS8 0xF010 - -#define PCI_VENDOR_ID_AUREAL 0x12eb -#define PCI_DEVICE_ID_AUREAL_VORTEX_1 0x0001 -#define PCI_DEVICE_ID_AUREAL_VORTEX_2 0x0002 - -#define PCI_VENDOR_ID_CBOARDS 0x1307 -#define PCI_DEVICE_ID_CBOARDS_DAS1602_16 0x0001 - -#define PCI_VENDOR_ID_SIIG 0x131f -#define PCI_DEVICE_ID_SIIG_1S_10x_550 0x1000 -#define PCI_DEVICE_ID_SIIG_1S_10x_650 0x1001 -#define PCI_DEVICE_ID_SIIG_1S_10x_850 0x1002 -#define PCI_DEVICE_ID_SIIG_1S1P_10x_550 0x1010 -#define PCI_DEVICE_ID_SIIG_1S1P_10x_650 0x1011 -#define PCI_DEVICE_ID_SIIG_1S1P_10x_850 0x1012 -#define PCI_DEVICE_ID_SIIG_1P_10x 0x1020 -#define PCI_DEVICE_ID_SIIG_2P_10x 0x1021 -#define PCI_DEVICE_ID_SIIG_2S_10x_550 0x1030 -#define PCI_DEVICE_ID_SIIG_2S_10x_650 0x1031 -#define PCI_DEVICE_ID_SIIG_2S_10x_850 0x1032 -#define PCI_DEVICE_ID_SIIG_2S1P_10x_550 0x1034 -#define PCI_DEVICE_ID_SIIG_2S1P_10x_650 0x1035 -#define PCI_DEVICE_ID_SIIG_2S1P_10x_850 0x1036 -#define PCI_DEVICE_ID_SIIG_4S_10x_550 0x1050 -#define PCI_DEVICE_ID_SIIG_4S_10x_650 0x1051 -#define PCI_DEVICE_ID_SIIG_4S_10x_850 0x1052 -#define PCI_DEVICE_ID_SIIG_1S_20x_550 0x2000 -#define PCI_DEVICE_ID_SIIG_1S_20x_650 0x2001 -#define PCI_DEVICE_ID_SIIG_1S_20x_850 0x2002 -#define PCI_DEVICE_ID_SIIG_1P_20x 0x2020 -#define PCI_DEVICE_ID_SIIG_2P_20x 0x2021 -#define PCI_DEVICE_ID_SIIG_2S_20x_550 0x2030 -#define PCI_DEVICE_ID_SIIG_2S_20x_650 0x2031 -#define PCI_DEVICE_ID_SIIG_2S_20x_850 0x2032 -#define PCI_DEVICE_ID_SIIG_2P1S_20x_550 0x2040 -#define PCI_DEVICE_ID_SIIG_2P1S_20x_650 0x2041 -#define PCI_DEVICE_ID_SIIG_2P1S_20x_850 0x2042 -#define PCI_DEVICE_ID_SIIG_1S1P_20x_550 0x2010 -#define PCI_DEVICE_ID_SIIG_1S1P_20x_650 0x2011 -#define PCI_DEVICE_ID_SIIG_1S1P_20x_850 0x2012 -#define PCI_DEVICE_ID_SIIG_4S_20x_550 0x2050 -#define PCI_DEVICE_ID_SIIG_4S_20x_650 0x2051 -#define PCI_DEVICE_ID_SIIG_4S_20x_850 0x2052 -#define PCI_DEVICE_ID_SIIG_2S1P_20x_550 0x2060 -#define PCI_DEVICE_ID_SIIG_2S1P_20x_650 0x2061 -#define PCI_DEVICE_ID_SIIG_2S1P_20x_850 0x2062 - -#define PCI_VENDOR_ID_DOMEX 0x134a -#define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001 - -#define PCI_VENDOR_ID_QUATECH 0x135C -#define PCI_DEVICE_ID_QUATECH_QSC100 0x0010 -#define PCI_DEVICE_ID_QUATECH_DSC100 0x0020 -#define PCI_DEVICE_ID_QUATECH_DSC200 0x0030 -#define PCI_DEVICE_ID_QUATECH_QSC200 0x0040 -#define PCI_DEVICE_ID_QUATECH_ESC100D 0x0050 -#define PCI_DEVICE_ID_QUATECH_ESC100M 0x0060 - -#define PCI_VENDOR_ID_SEALEVEL 0x135e -#define PCI_DEVICE_ID_SEALEVEL_U530 0x7101 -#define PCI_DEVICE_ID_SEALEVEL_UCOMM2 0x7201 -#define PCI_DEVICE_ID_SEALEVEL_UCOMM422 0x7402 -#define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202 -#define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401 -#define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801 - -#define PCI_VENDOR_ID_HYPERCOPE 0x1365 -#define PCI_DEVICE_ID_HYPERCOPE_PLX 0x9050 -#define PCI_SUBDEVICE_ID_HYPERCOPE_OLD_ERGO 0x0104 -#define PCI_SUBDEVICE_ID_HYPERCOPE_ERGO 0x0106 -#define PCI_SUBDEVICE_ID_HYPERCOPE_METRO 0x0107 -#define PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2 0x0108 -#define PCI_SUBDEVICE_ID_HYPERCOPE_PLEXUS 0x0109 - -#define PCI_VENDOR_ID_KAWASAKI 0x136b -#define PCI_DEVICE_ID_MCHIP_KL5A72002 0xff01 - -#define PCI_VENDOR_ID_LMC 0x1376 -#define PCI_DEVICE_ID_LMC_HSSI 0x0003 -#define PCI_DEVICE_ID_LMC_DS3 0x0004 -#define PCI_DEVICE_ID_LMC_SSI 0x0005 -#define PCI_DEVICE_ID_LMC_T1 0x0006 - -#define PCI_VENDOR_ID_NETGEAR 0x1385 -#define PCI_DEVICE_ID_NETGEAR_GA620 0x620a -#define PCI_DEVICE_ID_NETGEAR_GA622 0x622a - -#define PCI_VENDOR_ID_APPLICOM 0x1389 -#define PCI_DEVICE_ID_APPLICOM_PCIGENERIC 0x0001 -#define PCI_DEVICE_ID_APPLICOM_PCI2000IBS_CAN 0x0002 -#define PCI_DEVICE_ID_APPLICOM_PCI2000PFB 0x0003 - -#define PCI_VENDOR_ID_MOXA 0x1393 -#define PCI_DEVICE_ID_MOXA_C104 0x1040 -#define PCI_DEVICE_ID_MOXA_C168 0x1680 -#define PCI_DEVICE_ID_MOXA_CP204J 0x2040 -#define PCI_DEVICE_ID_MOXA_C218 0x2180 -#define PCI_DEVICE_ID_MOXA_C320 0x3200 - -#define PCI_VENDOR_ID_CCD 0x1397 -#define PCI_DEVICE_ID_CCD_2BD0 0x2bd0 -#define PCI_DEVICE_ID_CCD_B000 0xb000 -#define PCI_DEVICE_ID_CCD_B006 0xb006 -#define PCI_DEVICE_ID_CCD_B007 0xb007 -#define PCI_DEVICE_ID_CCD_B008 0xb008 -#define PCI_DEVICE_ID_CCD_B009 0xb009 -#define PCI_DEVICE_ID_CCD_B00A 0xb00a -#define PCI_DEVICE_ID_CCD_B00B 0xb00b -#define PCI_DEVICE_ID_CCD_B00C 0xb00c -#define PCI_DEVICE_ID_CCD_B100 0xb100 - -#define PCI_VENDOR_ID_3WARE 0x13C1 -#define PCI_DEVICE_ID_3WARE_1000 0x1000 - -#define PCI_VENDOR_ID_ABOCOM 0x13D1 -#define PCI_DEVICE_ID_ABOCOM_2BD1 0x2BD1 - -#define PCI_VENDOR_ID_CMEDIA 0x13f6 -#define PCI_DEVICE_ID_CMEDIA_CM8338A 0x0100 -#define PCI_DEVICE_ID_CMEDIA_CM8338B 0x0101 -#define PCI_DEVICE_ID_CMEDIA_CM8738 0x0111 -#define PCI_DEVICE_ID_CMEDIA_CM8738B 0x0112 - -#define PCI_VENDOR_ID_LAVA 0x1407 -#define PCI_DEVICE_ID_LAVA_DSERIAL 0x0100 /* 2x 16550 */ -#define PCI_DEVICE_ID_LAVA_QUATRO_A 0x0101 /* 2x 16550, half of 4 port */ -#define PCI_DEVICE_ID_LAVA_QUATRO_B 0x0102 /* 2x 16550, half of 4 port */ -#define PCI_DEVICE_ID_LAVA_OCTO_A 0x0180 /* 4x 16550A, half of 8 port */ -#define PCI_DEVICE_ID_LAVA_OCTO_B 0x0181 /* 4x 16550A, half of 8 port */ -#define PCI_DEVICE_ID_LAVA_PORT_PLUS 0x0200 /* 2x 16650 */ -#define PCI_DEVICE_ID_LAVA_QUAD_A 0x0201 /* 2x 16650, half of 4 port */ -#define PCI_DEVICE_ID_LAVA_QUAD_B 0x0202 /* 2x 16650, half of 4 port */ -#define PCI_DEVICE_ID_LAVA_SSERIAL 0x0500 /* 1x 16550 */ -#define PCI_DEVICE_ID_LAVA_PORT_650 0x0600 /* 1x 16650 */ -#define PCI_DEVICE_ID_LAVA_PARALLEL 0x8000 -#define PCI_DEVICE_ID_LAVA_DUAL_PAR_A 0x8002 /* The Lava Dual Parallel is */ -#define PCI_DEVICE_ID_LAVA_DUAL_PAR_B 0x8003 /* two PCI devices on a card */ -#define PCI_DEVICE_ID_LAVA_BOCA_IOPPAR 0x8800 - -#define PCI_VENDOR_ID_TIMEDIA 0x1409 -#define PCI_DEVICE_ID_TIMEDIA_1889 0x7168 - -#define PCI_VENDOR_ID_OXSEMI 0x1415 -#define PCI_DEVICE_ID_OXSEMI_12PCI840 0x8403 -#define PCI_DEVICE_ID_OXSEMI_16PCI954 0x9501 -#define PCI_DEVICE_ID_OXSEMI_16PCI95N 0x9511 -#define PCI_DEVICE_ID_OXSEMI_16PCI954PP 0x9513 -#define PCI_DEVICE_ID_OXSEMI_16PCI952 0x9521 - -#define PCI_VENDOR_ID_AIRONET 0x14b9 -#define PCI_DEVICE_ID_AIRONET_4800_1 0x0001 -#define PCI_DEVICE_ID_AIRONET_4800 0x4500 // values switched? see -#define PCI_DEVICE_ID_AIRONET_4500 0x4800 // drivers/net/aironet4500_card.c - -#define PCI_VENDOR_ID_TITAN 0x14D2 -#define PCI_DEVICE_ID_TITAN_010L 0x8001 -#define PCI_DEVICE_ID_TITAN_100L 0x8010 -#define PCI_DEVICE_ID_TITAN_110L 0x8011 -#define PCI_DEVICE_ID_TITAN_200L 0x8020 -#define PCI_DEVICE_ID_TITAN_210L 0x8021 -#define PCI_DEVICE_ID_TITAN_400L 0x8040 -#define PCI_DEVICE_ID_TITAN_800L 0x8080 -#define PCI_DEVICE_ID_TITAN_100 0xA001 -#define PCI_DEVICE_ID_TITAN_200 0xA005 -#define PCI_DEVICE_ID_TITAN_400 0xA003 -#define PCI_DEVICE_ID_TITAN_800B 0xA004 - -#define PCI_VENDOR_ID_PANACOM 0x14d4 -#define PCI_DEVICE_ID_PANACOM_QUADMODEM 0x0400 -#define PCI_DEVICE_ID_PANACOM_DUALMODEM 0x0402 - -#define PCI_VENDOR_ID_AFAVLAB 0x14db -#define PCI_DEVICE_ID_AFAVLAB_P028 0x2180 - -#define PCI_VENDOR_ID_BROADCOM 0x14e4 -#define PCI_DEVICE_ID_TIGON3_5700 0x1644 -#define PCI_DEVICE_ID_TIGON3_5701 0x1645 -#define PCI_DEVICE_ID_TIGON3_5702 0x1646 -#define PCI_DEVICE_ID_TIGON3_5703 0x1647 -#define PCI_DEVICE_ID_TIGON3_5704 0x1648 -#define PCI_DEVICE_ID_TIGON3_5702FE 0x164d -#define PCI_DEVICE_ID_TIGON3_5702X 0x16a6 -#define PCI_DEVICE_ID_TIGON3_5703X 0x16a7 -#define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 -#define PCI_DEVICE_ID_TIGON3_5702A3 0x16c6 -#define PCI_DEVICE_ID_TIGON3_5703A3 0x16c7 - -#define PCI_VENDOR_ID_SYBA 0x1592 -#define PCI_DEVICE_ID_SYBA_2P_EPP 0x0782 -#define PCI_DEVICE_ID_SYBA_1P_ECP 0x0783 - -#define PCI_VENDOR_ID_MORETON 0x15aa -#define PCI_DEVICE_ID_RASTEL_2PORT 0x2000 - -#define PCI_VENDOR_ID_ZOLTRIX 0x15b0 -#define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 - -#define PCI_VENDOR_ID_PDC 0x15e9 -#define PCI_DEVICE_ID_PDC_ADMA100 0x1841 - -#define PCI_VENDOR_ID_ALTIMA 0x173b -#define PCI_DEVICE_ID_ALTIMA_AC1000 0x03e8 -#define PCI_DEVICE_ID_ALTIMA_AC9100 0x03ea - -#define PCI_VENDOR_ID_SYMPHONY 0x1c1c -#define PCI_DEVICE_ID_SYMPHONY_101 0x0001 - -#define PCI_VENDOR_ID_TEKRAM 0x1de1 -#define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 - -#define PCI_VENDOR_ID_HINT 0x3388 -#define PCI_DEVICE_ID_HINT_VXPROII_IDE 0x8013 - -#define PCI_VENDOR_ID_3DLABS 0x3d3d -#define PCI_DEVICE_ID_3DLABS_300SX 0x0001 -#define PCI_DEVICE_ID_3DLABS_500TX 0x0002 -#define PCI_DEVICE_ID_3DLABS_DELTA 0x0003 -#define PCI_DEVICE_ID_3DLABS_PERMEDIA 0x0004 -#define PCI_DEVICE_ID_3DLABS_MX 0x0006 -#define PCI_DEVICE_ID_3DLABS_PERMEDIA2 0x0007 -#define PCI_DEVICE_ID_3DLABS_GAMMA 0x0008 -#define PCI_DEVICE_ID_3DLABS_PERMEDIA2V 0x0009 - -#define PCI_VENDOR_ID_AVANCE 0x4005 -#define PCI_DEVICE_ID_AVANCE_ALG2064 0x2064 -#define PCI_DEVICE_ID_AVANCE_2302 0x2302 - -#define PCI_VENDOR_ID_AKS 0x416c -#define PCI_DEVICE_ID_AKS_ALADDINCARD 0x0100 -#define PCI_DEVICE_ID_AKS_CPC 0x0200 - -#define PCI_VENDOR_ID_NETVIN 0x4a14 -#define PCI_DEVICE_ID_NETVIN_NV5000SC 0x5000 - -#define PCI_VENDOR_ID_S3 0x5333 -#define PCI_DEVICE_ID_S3_PLATO_PXS 0x0551 -#define PCI_DEVICE_ID_S3_ViRGE 0x5631 -#define PCI_DEVICE_ID_S3_TRIO 0x8811 -#define PCI_DEVICE_ID_S3_AURORA64VP 0x8812 -#define PCI_DEVICE_ID_S3_TRIO64UVP 0x8814 -#define PCI_DEVICE_ID_S3_ViRGE_VX 0x883d -#define PCI_DEVICE_ID_S3_868 0x8880 -#define PCI_DEVICE_ID_S3_928 0x88b0 -#define PCI_DEVICE_ID_S3_864_1 0x88c0 -#define PCI_DEVICE_ID_S3_864_2 0x88c1 -#define PCI_DEVICE_ID_S3_964_1 0x88d0 -#define PCI_DEVICE_ID_S3_964_2 0x88d1 -#define PCI_DEVICE_ID_S3_968 0x88f0 -#define PCI_DEVICE_ID_S3_TRIO64V2 0x8901 -#define PCI_DEVICE_ID_S3_PLATO_PXG 0x8902 -#define PCI_DEVICE_ID_S3_ViRGE_DXGX 0x8a01 -#define PCI_DEVICE_ID_S3_ViRGE_GX2 0x8a10 -#define PCI_DEVICE_ID_S3_ViRGE_MX 0x8c01 -#define PCI_DEVICE_ID_S3_ViRGE_MXP 0x8c02 -#define PCI_DEVICE_ID_S3_ViRGE_MXPMV 0x8c03 -#define PCI_DEVICE_ID_S3_SONICVIBES 0xca00 - -#define PCI_VENDOR_ID_DUNORD 0x5544 -#define PCI_DEVICE_ID_DUNORD_I3000 0x0001 -#define PCI_VENDOR_ID_GENROCO 0x5555 -#define PCI_DEVICE_ID_GENROCO_HFP832 0x0003 - -#define PCI_VENDOR_ID_DCI 0x6666 -#define PCI_DEVICE_ID_DCI_PCCOM4 0x0001 -#define PCI_DEVICE_ID_DCI_PCCOM8 0x0002 - -#define PCI_VENDOR_ID_INTEL 0x8086 -#define PCI_DEVICE_ID_INTEL_21145 0x0039 -#define PCI_DEVICE_ID_INTEL_82375 0x0482 -#define PCI_DEVICE_ID_INTEL_82424 0x0483 -#define PCI_DEVICE_ID_INTEL_82378 0x0484 -#define PCI_DEVICE_ID_INTEL_82430 0x0486 -#define PCI_DEVICE_ID_INTEL_82434 0x04a3 -#define PCI_DEVICE_ID_INTEL_I960 0x0960 -#define PCI_DEVICE_ID_INTEL_I960RM 0x0962 -#define PCI_DEVICE_ID_INTEL_82562ET 0x1031 - -#define PCI_DEVICE_ID_INTEL_82815_MC 0x1130 - -#define PCI_DEVICE_ID_INTEL_82559ER 0x1209 -#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 -#define PCI_DEVICE_ID_INTEL_82092AA_1 0x1222 -#define PCI_DEVICE_ID_INTEL_7116 0x1223 -#define PCI_DEVICE_ID_INTEL_82596 0x1226 -#define PCI_DEVICE_ID_INTEL_82865 0x1227 -#define PCI_DEVICE_ID_INTEL_82557 0x1229 -#define PCI_DEVICE_ID_INTEL_82437 0x122d -#define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e -#define PCI_DEVICE_ID_INTEL_82371FB_1 0x1230 -#define PCI_DEVICE_ID_INTEL_82371MX 0x1234 -#define PCI_DEVICE_ID_INTEL_82437MX 0x1235 -#define PCI_DEVICE_ID_INTEL_82441 0x1237 -#define PCI_DEVICE_ID_INTEL_82380FB 0x124b -#define PCI_DEVICE_ID_INTEL_82439 0x1250 -#define PCI_DEVICE_ID_INTEL_80960_RP 0x1960 -#define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 -#define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 -#define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 -#define PCI_DEVICE_ID_INTEL_82437VX 0x7030 -#define PCI_DEVICE_ID_INTEL_82439TX 0x7100 -#define PCI_DEVICE_ID_INTEL_82371AB_0 0x7110 -#define PCI_DEVICE_ID_INTEL_82371AB 0x7111 -#define PCI_DEVICE_ID_INTEL_82371AB_2 0x7112 -#define PCI_DEVICE_ID_INTEL_82371AB_3 0x7113 -#define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 -#define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 -#define PCI_DEVICE_ID_INTEL_82801AA_2 0x2412 -#define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 -#define PCI_DEVICE_ID_INTEL_82801AA_5 0x2415 -#define PCI_DEVICE_ID_INTEL_82801AA_6 0x2416 -#define PCI_DEVICE_ID_INTEL_82801AA_8 0x2418 -#define PCI_DEVICE_ID_INTEL_82801AB_0 0x2420 -#define PCI_DEVICE_ID_INTEL_82801AB_1 0x2421 -#define PCI_DEVICE_ID_INTEL_82801AB_2 0x2422 -#define PCI_DEVICE_ID_INTEL_82801AB_3 0x2423 -#define PCI_DEVICE_ID_INTEL_82801AB_5 0x2425 -#define PCI_DEVICE_ID_INTEL_82801AB_6 0x2426 -#define PCI_DEVICE_ID_INTEL_82801AB_8 0x2428 -#define PCI_DEVICE_ID_INTEL_82801BA_0 0x2440 -#define PCI_DEVICE_ID_INTEL_82801BA_1 0x2442 -#define PCI_DEVICE_ID_INTEL_82801BA_2 0x2443 -#define PCI_DEVICE_ID_INTEL_82801BA_3 0x2444 -#define PCI_DEVICE_ID_INTEL_82801BA_4 0x2445 -#define PCI_DEVICE_ID_INTEL_82801BA_5 0x2446 -#define PCI_DEVICE_ID_INTEL_82801BA_6 0x2448 -#define PCI_DEVICE_ID_INTEL_82801BA_7 0x2449 -#define PCI_DEVICE_ID_INTEL_82801BA_8 0x244a -#define PCI_DEVICE_ID_INTEL_82801BA_9 0x244b -#define PCI_DEVICE_ID_INTEL_82801BA_10 0x244c -#define PCI_DEVICE_ID_INTEL_82801BA_11 0x244e -#define PCI_DEVICE_ID_INTEL_82801E_0 0x2450 -#define PCI_DEVICE_ID_INTEL_82801E_2 0x2452 -#define PCI_DEVICE_ID_INTEL_82801E_3 0x2453 -#define PCI_DEVICE_ID_INTEL_82801E_9 0x2459 -#define PCI_DEVICE_ID_INTEL_82801E_11 0x245B -#define PCI_DEVICE_ID_INTEL_82801E_14 0x245D -#define PCI_DEVICE_ID_INTEL_82801E_15 0x245E -#define PCI_DEVICE_ID_INTEL_82801CA_0 0x2480 -#define PCI_DEVICE_ID_INTEL_82801CA_2 0x2482 -#define PCI_DEVICE_ID_INTEL_82801CA_3 0x2483 -#define PCI_DEVICE_ID_INTEL_82801CA_4 0x2484 -#define PCI_DEVICE_ID_INTEL_82801CA_5 0x2485 -#define PCI_DEVICE_ID_INTEL_82801CA_6 0x2486 -#define PCI_DEVICE_ID_INTEL_82801CA_7 0x2487 -#define PCI_DEVICE_ID_INTEL_82801CA_10 0x248a -#define PCI_DEVICE_ID_INTEL_82801CA_11 0x248b -#define PCI_DEVICE_ID_INTEL_82801CA_12 0x248c -#define PCI_DEVICE_ID_INTEL_82801DB_0 0x24c0 -#define PCI_DEVICE_ID_INTEL_82801DB_2 0x24c2 -#define PCI_DEVICE_ID_INTEL_82801DB_3 0x24c3 -#define PCI_DEVICE_ID_INTEL_82801DB_4 0x24c4 -#define PCI_DEVICE_ID_INTEL_82801DB_5 0x24c5 -#define PCI_DEVICE_ID_INTEL_82801DB_6 0x24c6 -#define PCI_DEVICE_ID_INTEL_82801DB_7 0x24c7 -#define PCI_DEVICE_ID_INTEL_82801DB_10 0x24ca -#define PCI_DEVICE_ID_INTEL_82801DB_11 0x24cb -#define PCI_DEVICE_ID_INTEL_82801DB_13 0x24cd -#define PCI_DEVICE_ID_INTEL_82801EB_0 0x24d0 -#define PCI_DEVICE_ID_INTEL_82801EB_1 0x24d1 -#define PCI_DEVICE_ID_INTEL_82801EB_2 0x24d2 -#define PCI_DEVICE_ID_INTEL_82801EB_3 0x24d3 -#define PCI_DEVICE_ID_INTEL_82801EB_4 0x24d4 -#define PCI_DEVICE_ID_INTEL_82801EB_5 0x24d5 -#define PCI_DEVICE_ID_INTEL_82801EB_6 0x24d6 -#define PCI_DEVICE_ID_INTEL_82801EB_7 0x24d7 -#define PCI_DEVICE_ID_INTEL_82801DB_10 0x24ca -#define PCI_DEVICE_ID_INTEL_82801EB_11 0x24db -#define PCI_DEVICE_ID_INTEL_82801EB_13 0x24dd -#define PCI_DEVICE_ID_INTEL_80310 0x530d -#define PCI_DEVICE_ID_INTEL_82810_MC1 0x7120 -#define PCI_DEVICE_ID_INTEL_82810_IG1 0x7121 -#define PCI_DEVICE_ID_INTEL_82810_MC3 0x7122 -#define PCI_DEVICE_ID_INTEL_82810_IG3 0x7123 -#define PCI_DEVICE_ID_INTEL_82443LX_0 0x7180 -#define PCI_DEVICE_ID_INTEL_82443LX_1 0x7181 -#define PCI_DEVICE_ID_INTEL_82443BX_0 0x7190 -#define PCI_DEVICE_ID_INTEL_82443BX_1 0x7191 -#define PCI_DEVICE_ID_INTEL_82443BX_2 0x7192 -#define PCI_DEVICE_ID_INTEL_82443MX_0 0x7198 -#define PCI_DEVICE_ID_INTEL_82443MX_1 0x7199 -#define PCI_DEVICE_ID_INTEL_82443MX_2 0x719a -#define PCI_DEVICE_ID_INTEL_82443MX_3 0x719b -#define PCI_DEVICE_ID_INTEL_82372FB_0 0x7600 -#define PCI_DEVICE_ID_INTEL_82372FB_1 0x7601 -#define PCI_DEVICE_ID_INTEL_82372FB_2 0x7602 -#define PCI_DEVICE_ID_INTEL_82372FB_3 0x7603 -#define PCI_DEVICE_ID_INTEL_82454GX 0x84c4 -#define PCI_DEVICE_ID_INTEL_82450GX 0x84c5 -#define PCI_DEVICE_ID_INTEL_82451NX 0x84ca -#define PCI_DEVICE_ID_INTEL_82454NX 0x84cb - -#define PCI_VENDOR_ID_COMPUTONE 0x8e0e -#define PCI_DEVICE_ID_COMPUTONE_IP2EX 0x0291 -#define PCI_DEVICE_ID_COMPUTONE_PG 0x0302 -#define PCI_SUBVENDOR_ID_COMPUTONE 0x8e0e -#define PCI_SUBDEVICE_ID_COMPUTONE_PG4 0x0001 -#define PCI_SUBDEVICE_ID_COMPUTONE_PG8 0x0002 -#define PCI_SUBDEVICE_ID_COMPUTONE_PG6 0x0003 - -#define PCI_VENDOR_ID_KTI 0x8e2e -#define PCI_DEVICE_ID_KTI_ET32P2 0x3000 - -#define PCI_VENDOR_ID_ADAPTEC 0x9004 -#define PCI_DEVICE_ID_ADAPTEC_7810 0x1078 -#define PCI_DEVICE_ID_ADAPTEC_7821 0x2178 -#define PCI_DEVICE_ID_ADAPTEC_38602 0x3860 -#define PCI_DEVICE_ID_ADAPTEC_7850 0x5078 -#define PCI_DEVICE_ID_ADAPTEC_7855 0x5578 -#define PCI_DEVICE_ID_ADAPTEC_5800 0x5800 -#define PCI_DEVICE_ID_ADAPTEC_3860 0x6038 -#define PCI_DEVICE_ID_ADAPTEC_1480A 0x6075 -#define PCI_DEVICE_ID_ADAPTEC_7860 0x6078 -#define PCI_DEVICE_ID_ADAPTEC_7861 0x6178 -#define PCI_DEVICE_ID_ADAPTEC_7870 0x7078 -#define PCI_DEVICE_ID_ADAPTEC_7871 0x7178 -#define PCI_DEVICE_ID_ADAPTEC_7872 0x7278 -#define PCI_DEVICE_ID_ADAPTEC_7873 0x7378 -#define PCI_DEVICE_ID_ADAPTEC_7874 0x7478 -#define PCI_DEVICE_ID_ADAPTEC_7895 0x7895 -#define PCI_DEVICE_ID_ADAPTEC_7880 0x8078 -#define PCI_DEVICE_ID_ADAPTEC_7881 0x8178 -#define PCI_DEVICE_ID_ADAPTEC_7882 0x8278 -#define PCI_DEVICE_ID_ADAPTEC_7883 0x8378 -#define PCI_DEVICE_ID_ADAPTEC_7884 0x8478 -#define PCI_DEVICE_ID_ADAPTEC_7885 0x8578 -#define PCI_DEVICE_ID_ADAPTEC_7886 0x8678 -#define PCI_DEVICE_ID_ADAPTEC_7887 0x8778 -#define PCI_DEVICE_ID_ADAPTEC_7888 0x8878 -#define PCI_DEVICE_ID_ADAPTEC_1030 0x8b78 - -#define PCI_VENDOR_ID_ADAPTEC2 0x9005 -#define PCI_DEVICE_ID_ADAPTEC2_2940U2 0x0010 -#define PCI_DEVICE_ID_ADAPTEC2_2930U2 0x0011 -#define PCI_DEVICE_ID_ADAPTEC2_7890B 0x0013 -#define PCI_DEVICE_ID_ADAPTEC2_7890 0x001f -#define PCI_DEVICE_ID_ADAPTEC2_3940U2 0x0050 -#define PCI_DEVICE_ID_ADAPTEC2_3950U2D 0x0051 -#define PCI_DEVICE_ID_ADAPTEC2_7896 0x005f -#define PCI_DEVICE_ID_ADAPTEC2_7892A 0x0080 -#define PCI_DEVICE_ID_ADAPTEC2_7892B 0x0081 -#define PCI_DEVICE_ID_ADAPTEC2_7892D 0x0083 -#define PCI_DEVICE_ID_ADAPTEC2_7892P 0x008f -#define PCI_DEVICE_ID_ADAPTEC2_7899A 0x00c0 -#define PCI_DEVICE_ID_ADAPTEC2_7899B 0x00c1 -#define PCI_DEVICE_ID_ADAPTEC2_7899D 0x00c3 -#define PCI_DEVICE_ID_ADAPTEC2_7899P 0x00cf - -#define PCI_VENDOR_ID_ATRONICS 0x907f -#define PCI_DEVICE_ID_ATRONICS_2015 0x2015 - -#define PCI_VENDOR_ID_HOLTEK 0x9412 -#define PCI_DEVICE_ID_HOLTEK_6565 0x6565 - -#define PCI_VENDOR_ID_NETMOS 0x9710 -#define PCI_DEVICE_ID_NETMOS_9735 0x9735 -#define PCI_DEVICE_ID_NETMOS_9835 0x9835 - -#define PCI_SUBVENDOR_ID_EXSYS 0xd84d -#define PCI_SUBDEVICE_ID_EXSYS_4014 0x4014 - -#define PCI_VENDOR_ID_TIGERJET 0xe159 -#define PCI_DEVICE_ID_TIGERJET_300 0x0001 -#define PCI_DEVICE_ID_TIGERJET_100 0x0002 - -#define PCI_VENDOR_ID_ARK 0xedd8 -#define PCI_DEVICE_ID_ARK_STING 0xa091 -#define PCI_DEVICE_ID_ARK_STINGARK 0xa099 -#define PCI_DEVICE_ID_ARK_2000MT 0xa0a1 - -#define PCI_VENDOR_ID_MICROGATE 0x13c0 -#define PCI_DEVICE_ID_MICROGATE_USC 0x0010 -#define PCI_DEVICE_ID_MICROGATE_SCC 0x0020 -#define PCI_DEVICE_ID_MICROGATE_SCA 0x0030 diff --git a/lib/usb/include/linux/usb.h b/lib/usb/include/linux/usb.h deleted file mode 100644 index 2abb801f0..000000000 --- a/lib/usb/include/linux/usb.h +++ /dev/null @@ -1,1032 +0,0 @@ -#ifndef __LINUX_USB_H -#define __LINUX_USB_H - - -#include "usb_ch9.h" - -#define USB_MAJOR 180 - - -#ifdef __KERNEL__ -#if 0 -#include -#include /* for -ENODEV */ -#include /* for mdelay() */ -#include /* for in_interrupt() */ -#include /* for struct list_head */ -#include /* for struct device */ -#include /* for struct file_operations */ -#include /* for struct completion */ -#include /* for current && schedule_timeout */ - - -static __inline__ void wait_ms(unsigned int ms) -{ - if(!in_interrupt()) { - current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(1 + ms * HZ / 1000); - } - else - mdelay(ms); -} -#endif -struct usb_device; - -/*-------------------------------------------------------------------------*/ - -/* - * Host-side wrappers for standard USB descriptors ... these are parsed - * from the data provided by devices. Parsing turns them from a flat - * sequence of descriptors into a hierarchy: - * - * - devices have one (usually) or more configs; - * - configs have one (often) or more interfaces; - * - interfaces have one (usually) or more settings; - * - each interface setting has zero or (usually) more endpoints. - * - * And there might be other descriptors mixed in with those. - * - * Devices may also have class-specific or vendor-specific descriptors. - */ - -/* host-side wrapper for parsed endpoint descriptors */ -struct usb_host_endpoint { - struct usb_endpoint_descriptor desc; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -/* host-side wrapper for one interface setting's parsed descriptors */ -struct usb_host_interface { - struct usb_interface_descriptor desc; - - /* array of desc.bNumEndpoint endpoints associated with this - * interface setting. these will be in no particular order. - */ - struct usb_host_endpoint *endpoint; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -/** - * struct usb_interface - what usb device drivers talk to - * @altsetting: array of interface descriptors, one for each alternate - * setting that may be selected. Each one includes a set of - * endpoint configurations and will be in numberic order, - * 0..num_altsetting. - * @num_altsetting: number of altsettings defined. - * @act_altsetting: index of current altsetting. this number is always - * less than num_altsetting. after the device is configured, each - * interface uses its default setting of zero. - * @max_altsetting: - * @minor: the minor number assigned to this interface, if this - * interface is bound to a driver that uses the USB major number. - * If this interface does not use the USB major, this field should - * be unused. The driver should set this value in the probe() - * function of the driver, after it has been assigned a minor - * number from the USB core by calling usb_register_dev(). - * @dev: driver model's view of this device - * @class_dev: driver model's class view of this device. - * - * USB device drivers attach to interfaces on a physical device. Each - * interface encapsulates a single high level function, such as feeding - * an audio stream to a speaker or reporting a change in a volume control. - * Many USB devices only have one interface. The protocol used to talk to - * an interface's endpoints can be defined in a usb "class" specification, - * or by a product's vendor. The (default) control endpoint is part of - * every interface, but is never listed among the interface's descriptors. - * - * The driver that is bound to the interface can use standard driver model - * calls such as dev_get_drvdata() on the dev member of this structure. - * - * Each interface may have alternate settings. The initial configuration - * of a device sets the first of these, but the device driver can change - * that setting using usb_set_interface(). Alternate settings are often - * used to control the the use of periodic endpoints, such as by having - * different endpoints use different amounts of reserved USB bandwidth. - * All standards-conformant USB devices that use isochronous endpoints - * will use them in non-default settings. - */ -struct usb_interface { - /* array of alternate settings for this interface. - * these will be in numeric order, 0..num_altsettting - */ - struct usb_host_interface *altsetting; - - unsigned act_altsetting; /* active alternate setting */ - unsigned num_altsetting; /* number of alternate settings */ - unsigned max_altsetting; /* total memory allocated */ - - struct usb_driver *driver; /* driver */ - int minor; /* minor number this interface is bound to */ - struct device dev; /* interface specific device info */ - struct class_device class_dev; -}; -#define to_usb_interface(d) container_of(d, struct usb_interface, dev) -#define class_dev_to_usb_interface(d) container_of(d, struct usb_interface, class_dev) -#define interface_to_usbdev(intf) \ - container_of(intf->dev.parent, struct usb_device, dev) - -static inline void *usb_get_intfdata (struct usb_interface *intf) -{ - return dev_get_drvdata (&intf->dev); -} - -static inline void usb_set_intfdata (struct usb_interface *intf, void *data) -{ - dev_set_drvdata(&intf->dev, data); -} - -/* USB_DT_CONFIG: Configuration descriptor information. - * - * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the - * descriptor type is different. Highspeed-capable devices can look - * different depending on what speed they're currently running. Only - * devices with a USB_DT_DEVICE_QUALIFIER have an OTHER_SPEED_CONFIG. - */ -struct usb_host_config { - struct usb_config_descriptor desc; - - /* the interfaces associated with this configuration - * these will be in numeric order, 0..desc.bNumInterfaces - */ - struct usb_interface *interface; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -// FIXME remove; exported only for drivers/usb/misc/auserwald.c -// prefer usb_device->epnum[0..31] -extern struct usb_endpoint_descriptor * - usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum); - -int __usb_get_extra_descriptor(char *buffer, unsigned size, - unsigned char type, void **ptr); -#define usb_get_extra_descriptor(ifpoint,type,ptr)\ - __usb_get_extra_descriptor((ifpoint)->extra,(ifpoint)->extralen,\ - type,(void**)ptr) - -/* -------------------------------------------------------------------------- */ - -struct usb_operations; - -/* USB device number allocation bitmap */ -struct usb_devmap { - unsigned long devicemap[128 / (8*sizeof(unsigned long))]; -}; - -/* - * Allocated per bus (tree of devices) we have: - */ -struct usb_bus { - struct device *controller; /* host/master side hardware */ - int busnum; /* Bus number (in order of reg) */ - char *bus_name; /* stable id (PCI slot_name etc) */ - - int devnum_next; /* Next open device number in round-robin allocation */ - - struct usb_devmap devmap; /* device address allocation map */ - struct usb_operations *op; /* Operations (specific to the HC) */ - struct usb_device *root_hub; /* Root hub */ - struct list_head bus_list; /* list of busses */ - void *hcpriv; /* Host Controller private data */ - - int bandwidth_allocated; /* on this bus: how much of the time - * reserved for periodic (intr/iso) - * requests is used, on average? - * Units: microseconds/frame. - * Limits: Full/low speed reserve 90%, - * while high speed reserves 80%. - */ - int bandwidth_int_reqs; /* number of Interrupt requests */ - int bandwidth_isoc_reqs; /* number of Isoc. requests */ - - struct dentry *usbfs_dentry; /* usbfs dentry entry for the bus */ - struct dentry *usbdevfs_dentry; /* usbdevfs dentry entry for the bus */ - - atomic_t refcnt; -}; - - -/* -------------------------------------------------------------------------- */ - -/* This is arbitrary. - * From USB 2.0 spec Table 11-13, offset 7, a hub can - * have up to 255 ports. The most yet reported is 10. - */ -#define USB_MAXCHILDREN (16) - -struct usb_tt; - -struct usb_device { - int devnum; /* Address on USB bus */ - char devpath [16]; /* Use in messages: /port/port/... */ - enum usb_device_state state; /* configured, not attached, etc */ - enum usb_device_speed speed; /* high/full/low (or error) */ - - struct usb_tt *tt; /* low/full speed dev, highspeed hub */ - int ttport; /* device port on that tt hub */ - - struct semaphore serialize; - - unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */ - unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */ - /* [0] = IN, [1] = OUT */ - int epmaxpacketin[16]; /* INput endpoint specific maximums */ - int epmaxpacketout[16]; /* OUTput endpoint specific maximums */ - - struct usb_device *parent; /* our hub, unless we're the root */ - struct usb_bus *bus; /* Bus we're part of */ - - struct device dev; /* Generic device interface */ - - struct usb_device_descriptor descriptor;/* Descriptor */ - struct usb_host_config *config; /* All of the configs */ - struct usb_host_config *actconfig;/* the active configuration */ - - char **rawdescriptors; /* Raw descriptors for each config */ - - int have_langid; /* whether string_langid is valid yet */ - int string_langid; /* language ID for strings */ - - void *hcpriv; /* Host Controller private data */ - - struct list_head filelist; - struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ - struct dentry *usbdevfs_dentry; /* usbdevfs dentry entry for the device */ - - /* - * Child devices - these can be either new devices - * (if this is a hub device), or different instances - * of this same device. - * - * Each instance needs its own set of data structures. - */ - - int maxchild; /* Number of ports if hub */ - struct usb_device *children[USB_MAXCHILDREN]; -}; -#define to_usb_device(d) container_of(d, struct usb_device, dev) - -extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *); -extern struct usb_device *usb_get_dev(struct usb_device *dev); -extern void usb_put_dev(struct usb_device *dev); - -/* mostly for devices emulating SCSI over USB */ -extern int usb_reset_device(struct usb_device *dev); - -extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); - -/* for drivers using iso endpoints */ -extern int usb_get_current_frame_number (struct usb_device *usb_dev); - -/* used these for multi-interface device registration */ -extern void usb_driver_claim_interface(struct usb_driver *driver, - struct usb_interface *iface, void* priv); -extern int usb_interface_claimed(struct usb_interface *iface); -extern void usb_driver_release_interface(struct usb_driver *driver, - struct usb_interface *iface); -const struct usb_device_id *usb_match_id(struct usb_interface *interface, - const struct usb_device_id *id); - -extern struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor); -extern struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum); - - -/** - * usb_make_path - returns stable device path in the usb tree - * @dev: the device whose path is being constructed - * @buf: where to put the string - * @size: how big is "buf"? - * - * Returns length of the string (> 0) or negative if size was too small. - * - * This identifier is intended to be "stable", reflecting physical paths in - * hardware such as physical bus addresses for host controllers or ports on - * USB hubs. That makes it stay the same until systems are physically - * reconfigured, by re-cabling a tree of USB devices or by moving USB host - * controllers. Adding and removing devices, including virtual root hubs - * in host controller driver modules, does not change these path identifers; - * neither does rebooting or re-enumerating. These are more useful identifiers - * than changeable ("unstable") ones like bus numbers or device addresses. - * - * With a partial exception for devices connected to USB 2.0 root hubs, these - * identifiers are also predictable. So long as the device tree isn't changed, - * plugging any USB device into a given hub port always gives it the same path. - * Because of the use of "companion" controllers, devices connected to ports on - * USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are - * high speed, and a different one if they are full or low speed. - */ -static inline int usb_make_path (struct usb_device *dev, char *buf, size_t size) -{ - int actual; - actual = snprintf (buf, size, "usb-%s-%s", dev->bus->bus_name, dev->devpath); - return (actual >= size) ? -1 : actual; -} - -/*-------------------------------------------------------------------------*/ - -#define USB_DEVICE_ID_MATCH_DEVICE (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) -#define USB_DEVICE_ID_MATCH_DEV_RANGE (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI) -#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE) -#define USB_DEVICE_ID_MATCH_DEV_INFO \ - (USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL) -#define USB_DEVICE_ID_MATCH_INT_INFO \ - (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL) - -/** - * USB_DEVICE - macro used to describe a specific usb device - * @vend: the 16 bit USB Vendor ID - * @prod: the 16 bit USB Product ID - * - * This macro is used to create a struct usb_device_id that matches a - * specific device. - */ -#define USB_DEVICE(vend,prod) \ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = (vend), .idProduct = (prod) -/** - * USB_DEVICE_VER - macro used to describe a specific usb device with a version range - * @vend: the 16 bit USB Vendor ID - * @prod: the 16 bit USB Product ID - * @lo: the bcdDevice_lo value - * @hi: the bcdDevice_hi value - * - * This macro is used to create a struct usb_device_id that matches a - * specific device, with a version range. - */ -#define USB_DEVICE_VER(vend,prod,lo,hi) \ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, .idVendor = (vend), .idProduct = (prod), .bcdDevice_lo = (lo), .bcdDevice_hi = (hi) - -/** - * USB_DEVICE_INFO - macro used to describe a class of usb devices - * @cl: bDeviceClass value - * @sc: bDeviceSubClass value - * @pr: bDeviceProtocol value - * - * This macro is used to create a struct usb_device_id that matches a - * specific class of devices. - */ -#define USB_DEVICE_INFO(cl,sc,pr) \ - .match_flags = USB_DEVICE_ID_MATCH_DEV_INFO, .bDeviceClass = (cl), .bDeviceSubClass = (sc), .bDeviceProtocol = (pr) - -/** - * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces - * @cl: bInterfaceClass value - * @sc: bInterfaceSubClass value - * @pr: bInterfaceProtocol value - * - * This macro is used to create a struct usb_device_id that matches a - * specific class of interfaces. - */ -#define USB_INTERFACE_INFO(cl,sc,pr) \ - .match_flags = USB_DEVICE_ID_MATCH_INT_INFO, .bInterfaceClass = (cl), .bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr) - -/* -------------------------------------------------------------------------- */ - -/** - * struct usb_driver - identifies USB driver to usbcore - * @owner: Pointer to the module owner of this driver; initialize - * it using THIS_MODULE. - * @name: The driver name should be unique among USB drivers, - * and should normally be the same as the module name. - * @probe: Called to see if the driver is willing to manage a particular - * interface on a device. If it is, probe returns zero and uses - * dev_set_drvdata() to associate driver-specific data with the - * interface. It may also use usb_set_interface() to specify the - * appropriate altsetting. If unwilling to manage the interface, - * return a negative errno value. - * @disconnect: Called when the interface is no longer accessible, usually - * because its device has been (or is being) disconnected or the - * driver module is being unloaded. - * @ioctl: Used for drivers that want to talk to userspace through - * the "usbfs" filesystem. This lets devices provide ways to - * expose information to user space regardless of where they - * do (or don't) show up otherwise in the filesystem. - * @id_table: USB drivers use ID table to support hotplugging. - * Export this with MODULE_DEVICE_TABLE(usb,...). This must be set - * or your driver's probe function will never get called. - * - * USB drivers must provide a name, probe() and disconnect() methods, - * and an id_table. Other driver fields are optional. - * - * The id_table is used in hotplugging. It holds a set of descriptors, - * and specialized data may be associated with each entry. That table - * is used by both user and kernel mode hotplugging support. - * - * The probe() and disconnect() methods are called in a context where - * they can sleep, but they should avoid abusing the privilege. Most - * work to connect to a device should be done when the device is opened, - * and undone at the last close. The disconnect code needs to address - * concurrency issues with respect to open() and close() methods, as - * well as forcing all pending I/O requests to complete (by unlinking - * them as necessary, and blocking until the unlinks complete). - */ -struct usb_driver { - struct module *owner; - - const char *name; - - int (*probe) (struct usb_interface *intf, - const struct usb_device_id *id); - - void (*disconnect) (struct usb_interface *intf); - - int (*ioctl) (struct usb_interface *intf, unsigned int code, void *buf); - - const struct usb_device_id *id_table; - - struct device_driver driver; - - struct semaphore serialize; -}; -#define to_usb_driver(d) container_of(d, struct usb_driver, driver) - -extern struct bus_type usb_bus_type; - -/** - * struct usb_class_driver - identifies a USB driver that wants to use the USB major number - * @name: devfs name for this driver. Will also be used by the driver - * class code to create a usb class device. - * @fops: pointer to the struct file_operations of this driver. - * @mode: the mode for the devfs file to be created for this driver. - * @minor_base: the start of the minor range for this driver. - * - * This structure is used for the usb_register_dev() and - * usb_unregister_dev() functions, to consolodate a number of the - * paramaters used for them. - */ -struct usb_class_driver { - char *name; - struct file_operations *fops; - mode_t mode; - int minor_base; -}; - -/* - * use these in module_init()/module_exit() - * and don't forget MODULE_DEVICE_TABLE(usb, ...) - */ -extern int usb_register(struct usb_driver *); -extern void usb_deregister(struct usb_driver *); - -extern int usb_register_dev(struct usb_interface *intf, - struct usb_class_driver *class_driver); -extern void usb_deregister_dev(struct usb_interface *intf, - struct usb_class_driver *class_driver); - -extern int usb_device_probe(struct device *dev); -extern int usb_device_remove(struct device *dev); -extern int usb_disabled(void); - -/* -------------------------------------------------------------------------- */ - -/* - * URB support, for asynchronous request completions - */ - -/* - * urb->transfer_flags: - */ -#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ -#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ -#define URB_NO_DMA_MAP 0x0004 /* urb->*_dma are valid on submit */ -#define URB_ASYNC_UNLINK 0x0008 /* usb_unlink_urb() returns asap */ -#define URB_NO_FSBR 0x0020 /* UHCI-specific */ -#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ -#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */ - -struct usb_iso_packet_descriptor { - unsigned int offset; - unsigned int length; /* expected length */ - unsigned int actual_length; - unsigned int status; -}; - -struct urb; -struct pt_regs; - -typedef void (*usb_complete_t)(struct urb *, struct pt_regs *); - -/** - * struct urb - USB Request Block - * @urb_list: For use by current owner of the URB. - * @pipe: Holds endpoint number, direction, type, and more. - * Create these values with the eight macros available; - * usb_{snd,rcv}TYPEpipe(dev,endpoint), where the type is "ctrl" - * (control), "bulk", "int" (interrupt), or "iso" (isochronous). - * For example usb_sndbulkpipe() or usb_rcvintpipe(). Endpoint - * numbers range from zero to fifteen. Note that "in" endpoint two - * is a different endpoint (and pipe) from "out" endpoint two. - * The current configuration controls the existence, type, and - * maximum packet size of any given endpoint. - * @dev: Identifies the USB device to perform the request. - * @status: This is read in non-iso completion functions to get the - * status of the particular request. ISO requests only use it - * to tell whether the URB was unlinked; detailed status for - * each frame is in the fields of the iso_frame-desc. - * @transfer_flags: A variety of flags may be used to affect how URB - * submission, unlinking, or operation are handled. Different - * kinds of URB can use different flags. - * @transfer_buffer: This identifies the buffer to (or from) which - * the I/O request will be performed (unless URB_NO_DMA_MAP is set). - * This buffer must be suitable for DMA; allocate it with kmalloc() - * or equivalent. For transfers to "in" endpoints, contents of - * this buffer will be modified. This buffer is used for data - * phases of control transfers. - * @transfer_dma: When transfer_flags includes URB_NO_DMA_MAP, the device - * driver is saying that it provided this DMA address, which the host - * controller driver should use instead of the transfer_buffer. - * @transfer_buffer_length: How big is transfer_buffer. The transfer may - * be broken up into chunks according to the current maximum packet - * size for the endpoint, which is a function of the configuration - * and is encoded in the pipe. When the length is zero, neither - * transfer_buffer nor transfer_dma is used. - * @actual_length: This is read in non-iso completion functions, and - * it tells how many bytes (out of transfer_buffer_length) were - * transferred. It will normally be the same as requested, unless - * either an error was reported or a short read was performed. - * The URB_SHORT_NOT_OK transfer flag may be used to make such - * short reads be reported as errors. - * @setup_packet: Only used for control transfers, this points to eight bytes - * of setup data. Control transfers always start by sending this data - * to the device. Then transfer_buffer is read or written, if needed. - * (Not used when URB_NO_DMA_MAP is set.) - * @setup_dma: For control transfers with URB_NO_DMA_MAP set, the device - * driver has provided this DMA address for the setup packet. The - * host controller driver should use this instead of setup_buffer. - * If there is a data phase, its buffer is identified by transfer_dma. - * @start_frame: Returns the initial frame for interrupt or isochronous - * transfers. - * @number_of_packets: Lists the number of ISO transfer buffers. - * @interval: Specifies the polling interval for interrupt or isochronous - * transfers. The units are frames (milliseconds) for for full and low - * speed devices, and microframes (1/8 millisecond) for highspeed ones. - * @error_count: Returns the number of ISO transfers that reported errors. - * @context: For use in completion functions. This normally points to - * request-specific driver context. - * @complete: Completion handler. This URB is passed as the parameter to the - * completion function. The completion function may then do what - * it likes with the URB, including resubmitting or freeing it. - * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to - * collect the transfer status for each buffer. - * - * This structure identifies USB transfer requests. URBs must be allocated by - * calling usb_alloc_urb() and freed with a call to usb_free_urb(). - * Initialization may be done using various usb_fill_*_urb() functions. URBs - * are submitted using usb_submit_urb(), and pending requests may be canceled - * using usb_unlink_urb(). - * - * Data Transfer Buffers: - * - * Normally drivers provide I/O buffers allocated with kmalloc() or otherwise - * taken from the general page pool. That is provided by transfer_buffer - * (control requests also use setup_packet), and host controller drivers - * perform a dma mapping (and unmapping) for each buffer transferred. Those - * mapping operations can be expensive on some platforms (perhaps using a dma - * bounce buffer or talking to an IOMMU), - * although they're cheap on commodity x86 and ppc hardware. - * - * Alternatively, drivers may pass the URB_NO_DMA_MAP transfer flag, which - * tells the host controller driver that no such mapping is needed since - * the device driver is DMA-aware. For example, they might allocate a DMA - * buffer with usb_buffer_alloc(), or call usb_buffer_map(). - * When this transfer flag is provided, host controller drivers will use the - * dma addresses found in the transfer_dma and/or setup_dma fields rather than - * determing a dma address themselves. - * - * Initialization: - * - * All URBs submitted must initialize dev, pipe, - * transfer_flags (may be zero), complete, timeout (may be zero). - * The URB_ASYNC_UNLINK transfer flag affects later invocations of - * the usb_unlink_urb() routine. - * - * All URBs must also initialize - * transfer_buffer and transfer_buffer_length. They may provide the - * URB_SHORT_NOT_OK transfer flag, indicating that short reads are - * to be treated as errors; that flag is invalid for write requests. - * - * Bulk URBs may - * use the URB_ZERO_PACKET transfer flag, indicating that bulk OUT transfers - * should always terminate with a short packet, even if it means adding an - * extra zero length packet. - * - * Control URBs must provide a setup_packet. - * - * Interrupt UBS must provide an interval, saying how often (in milliseconds - * or, for highspeed devices, 125 microsecond units) - * to poll for transfers. After the URB has been submitted, the interval - * and start_frame fields reflect how the transfer was actually scheduled. - * The polling interval may be more frequent than requested. - * For example, some controllers have a maximum interval of 32 microseconds, - * while others support intervals of up to 1024 microseconds. - * Isochronous URBs also have transfer intervals. (Note that for isochronous - * endpoints, as well as high speed interrupt endpoints, the encoding of - * the transfer interval in the endpoint descriptor is logarithmic.) - * - * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling - * the host controller to schedule the transfer as soon as bandwidth - * utilization allows, and then set start_frame to reflect the actual frame - * selected during submission. Otherwise drivers must specify the start_frame - * and handle the case where the transfer can't begin then. However, drivers - * won't know how bandwidth is currently allocated, and while they can - * find the current frame using usb_get_current_frame_number () they can't - * know the range for that frame number. (Ranges for frame counter values - * are HC-specific, and can go from 256 to 65536 frames from "now".) - * - * Isochronous URBs have a different data transfer model, in part because - * the quality of service is only "best effort". Callers provide specially - * allocated URBs, with number_of_packets worth of iso_frame_desc structures - * at the end. Each such packet is an individual ISO transfer. Isochronous - * URBs are normally queued, submitted by drivers to arrange that - * transfers are at least double buffered, and then explicitly resubmitted - * in completion handlers, so - * that data (such as audio or video) streams at as constant a rate as the - * host controller scheduler can support. - * - * Completion Callbacks: - * - * The completion callback is made in_interrupt(), and one of the first - * things that a completion handler should do is check the status field. - * The status field is provided for all URBs. It is used to report - * unlinked URBs, and status for all non-ISO transfers. It should not - * be examined before the URB is returned to the completion handler. - * - * The context field is normally used to link URBs back to the relevant - * driver or request state. - * - * When completion callback is invoked for non-isochronous URBs, the - * actual_length field tells how many bytes were transferred. - * - * ISO transfer status is reported in the status and actual_length fields - * of the iso_frame_desc array, and the number of errors is reported in - * error_count. Completion callbacks for ISO transfers will normally - * (re)submit URBs to ensure a constant transfer rate. - */ -struct urb -{ - spinlock_t lock; /* lock for the URB */ - atomic_t count; /* reference count of the URB */ - void *hcpriv; /* private data for host controller */ - struct list_head urb_list; /* list pointer to all active urbs */ - struct usb_device *dev; /* (in) pointer to associated device */ - unsigned int pipe; /* (in) pipe information */ - int status; /* (return) non-ISO status */ - unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/ - void *transfer_buffer; /* (in) associated data buffer */ - dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ - int transfer_buffer_length; /* (in) data buffer length */ - int actual_length; /* (return) actual transfer length */ - int bandwidth; /* bandwidth for INT/ISO request */ - unsigned char *setup_packet; /* (in) setup packet (control only) */ - dma_addr_t setup_dma; /* (in) dma addr for setup_packet */ - int start_frame; /* (modify) start frame (INT/ISO) */ - int number_of_packets; /* (in) number of ISO packets */ - int interval; /* (in) transfer interval (INT/ISO) */ - int error_count; /* (return) number of ISO errors */ - int timeout; /* (in) timeout, in jiffies */ - void *context; /* (in) context for completion */ - usb_complete_t complete; /* (in) completion routine */ - struct usb_iso_packet_descriptor iso_frame_desc[0]; /* (in) ISO ONLY */ -}; - -/* -------------------------------------------------------------------------- */ - -/** - * usb_fill_control_urb - initializes a control urb - * @urb: pointer to the urb to initialize. - * @dev: pointer to the struct usb_device for this urb. - * @pipe: the endpoint pipe - * @setup_packet: pointer to the setup_packet buffer - * @transfer_buffer: pointer to the transfer buffer - * @buffer_length: length of the transfer buffer - * @complete: pointer to the usb_complete_t function - * @context: what to set the urb context to. - * - * Initializes a control urb with the proper information needed to submit - * it to a device. - */ -static inline void usb_fill_control_urb (struct urb *urb, - struct usb_device *dev, - unsigned int pipe, - unsigned char *setup_packet, - void *transfer_buffer, - int buffer_length, - usb_complete_t complete, - void *context) -{ - spin_lock_init(&urb->lock); - urb->dev = dev; - urb->pipe = pipe; - urb->setup_packet = setup_packet; - urb->transfer_buffer = transfer_buffer; - urb->transfer_buffer_length = buffer_length; - urb->complete = complete; - urb->context = context; -} - -/** - * usb_fill_bulk_urb - macro to help initialize a bulk urb - * @urb: pointer to the urb to initialize. - * @dev: pointer to the struct usb_device for this urb. - * @pipe: the endpoint pipe - * @transfer_buffer: pointer to the transfer buffer - * @buffer_length: length of the transfer buffer - * @complete: pointer to the usb_complete_t function - * @context: what to set the urb context to. - * - * Initializes a bulk urb with the proper information needed to submit it - * to a device. - */ -static inline void usb_fill_bulk_urb (struct urb *urb, - struct usb_device *dev, - unsigned int pipe, - void *transfer_buffer, - int buffer_length, - usb_complete_t complete, - void *context) -{ - spin_lock_init(&urb->lock); - urb->dev = dev; - urb->pipe = pipe; - urb->transfer_buffer = transfer_buffer; - urb->transfer_buffer_length = buffer_length; - urb->complete = complete; - urb->context = context; -} - -/** - * usb_fill_int_urb - macro to help initialize a interrupt urb - * @urb: pointer to the urb to initialize. - * @dev: pointer to the struct usb_device for this urb. - * @pipe: the endpoint pipe - * @transfer_buffer: pointer to the transfer buffer - * @buffer_length: length of the transfer buffer - * @complete: pointer to the usb_complete_t function - * @context: what to set the urb context to. - * @interval: what to set the urb interval to, encoded like - * the endpoint descriptor's bInterval value. - * - * Initializes a interrupt urb with the proper information needed to submit - * it to a device. - * Note that high speed interrupt endpoints use a logarithmic encoding of - * the endpoint interval, and express polling intervals in microframes - * (eight per millisecond) rather than in frames (one per millisecond). - */ -static inline void usb_fill_int_urb (struct urb *urb, - struct usb_device *dev, - unsigned int pipe, - void *transfer_buffer, - int buffer_length, - usb_complete_t complete, - void *context, - int interval) -{ - spin_lock_init(&urb->lock); - urb->dev = dev; - urb->pipe = pipe; - urb->transfer_buffer = transfer_buffer; - urb->transfer_buffer_length = buffer_length; - urb->complete = complete; - urb->context = context; - if (dev->speed == USB_SPEED_HIGH) - urb->interval = 1 << (interval - 1); - else - urb->interval = interval; - urb->start_frame = -1; -} - -extern void usb_init_urb(struct urb *urb); -extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags); -extern void usb_free_urb(struct urb *urb); -#define usb_put_urb usb_free_urb -extern struct urb *usb_get_urb(struct urb *urb); -extern int usb_submit_urb(struct urb *urb, int mem_flags); -extern int usb_unlink_urb(struct urb *urb); - -#define HAVE_USB_BUFFERS -void *usb_buffer_alloc (struct usb_device *dev, size_t size, - int mem_flags, dma_addr_t *dma); -void usb_buffer_free (struct usb_device *dev, size_t size, - void *addr, dma_addr_t dma); - -struct urb *usb_buffer_map (struct urb *urb); -void usb_buffer_dmasync (struct urb *urb); -void usb_buffer_unmap (struct urb *urb); - -struct scatterlist; -int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int nents); -void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int n_hw_ents); -void usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe, - struct scatterlist *sg, int n_hw_ents); - -/*-------------------------------------------------------------------* - * SYNCHRONOUS CALL SUPPORT * - *-------------------------------------------------------------------*/ - -extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, - __u8 request, __u8 requesttype, __u16 value, __u16 index, - void *data, __u16 size, int timeout); -extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, - void *data, int len, int *actual_length, - int timeout); - -/* wrappers around usb_control_msg() for the most common standard requests */ -extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype, - unsigned char descindex, void *buf, int size); -extern int usb_get_device_descriptor(struct usb_device *dev); -extern int usb_get_status(struct usb_device *dev, - int type, int target, void *data); -extern int usb_get_string(struct usb_device *dev, - unsigned short langid, unsigned char index, void *buf, int size); -extern int usb_string(struct usb_device *dev, int index, - char *buf, size_t size); - -/* wrappers that also update important state inside usbcore */ -extern int usb_clear_halt(struct usb_device *dev, int pipe); -extern int usb_set_configuration(struct usb_device *dev, int configuration); -extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate); - -/* - * timeouts, in seconds, used for sending/receiving control messages - * they typically complete within a few frames (msec) after they're issued - * USB identifies 5 second timeouts, maybe more in a few cases, and a few - * slow devices (like some MGE Ellipse UPSes) actually push that limit. - */ -#define USB_CTRL_GET_TIMEOUT 5 -#define USB_CTRL_SET_TIMEOUT 5 - - -/** - * struct usb_sg_request - support for scatter/gather I/O - * @status: zero indicates success, else negative errno - * @bytes: counts bytes transferred. - * - * These requests are initialized using usb_sg_init(), and then are used - * as request handles passed to usb_sg_wait() or usb_sg_cancel(). Most - * members of the request object aren't for driver access. - * - * The status and bytecount values are valid only after usb_sg_wait() - * returns. If the status is zero, then the bytecount matches the total - * from the request. - * - * After an error completion, drivers may need to clear a halt condition - * on the endpoint. - */ -struct usb_sg_request { - int status; - size_t bytes; - - // members not documented above are private to usbcore, - // and are not provided for driver access! - spinlock_t lock; - - struct usb_device *dev; - int pipe; - struct scatterlist *sg; - int nents; - - int entries; - struct urb **urbs; - - int count; - struct completion complete; -}; - -int usb_sg_init ( - struct usb_sg_request *io, - struct usb_device *dev, - unsigned pipe, - unsigned period, - struct scatterlist *sg, - int nents, - size_t length, - int mem_flags -); -void usb_sg_cancel (struct usb_sg_request *io); -void usb_sg_wait (struct usb_sg_request *io); - - -/* -------------------------------------------------------------------------- */ - -/* - * Calling this entity a "pipe" is glorifying it. A USB pipe - * is something embarrassingly simple: it basically consists - * of the following information: - * - device number (7 bits) - * - endpoint number (4 bits) - * - current Data0/1 state (1 bit) [Historical; now gone] - * - direction (1 bit) - * - speed (1 bit) [Historical and specific to USB 1.1; now gone.] - * - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.] - * - pipe type (2 bits: control, interrupt, bulk, isochronous) - * - * That's 18 bits. Really. Nothing more. And the USB people have - * documented these eighteen bits as some kind of glorious - * virtual data structure. - * - * Let's not fall in that trap. We'll just encode it as a simple - * unsigned int. The encoding is: - * - * - max size: bits 0-1 [Historical; now gone.] - * - direction: bit 7 (0 = Host-to-Device [Out], - * 1 = Device-to-Host [In] ... - * like endpoint bEndpointAddress) - * - device: bits 8-14 ... bit positions known to uhci-hcd - * - endpoint: bits 15-18 ... bit positions known to uhci-hcd - * - Data0/1: bit 19 [Historical; now gone. ] - * - lowspeed: bit 26 [Historical; now gone. ] - * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, - * 10 = control, 11 = bulk) - * - * Why? Because it's arbitrary, and whatever encoding we select is really - * up to us. This one happens to share a lot of bit positions with the UHCI - * specification, so that much of the uhci driver can just mask the bits - * appropriately. - */ - -/* NOTE: these are not the standard USB_ENDPOINT_XFER_* values!! */ -#define PIPE_ISOCHRONOUS 0 -#define PIPE_INTERRUPT 1 -#define PIPE_CONTROL 2 -#define PIPE_BULK 3 - -#define usb_maxpacket(dev, pipe, out) (out \ - ? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \ - : (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] ) - -#define usb_pipein(pipe) ((pipe) & USB_DIR_IN) -#define usb_pipeout(pipe) (!usb_pipein(pipe)) -#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f) -#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf) -#define usb_pipetype(pipe) (((pipe) >> 30) & 3) -#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) -#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) -#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) -#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) - -/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */ -#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1) -#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep))) -#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | ((bit) << (ep))) - -/* Endpoint halt control/status ... likewise USE WITH CAUTION */ -#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep))) -#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep))) - - -static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int endpoint) -{ - return (dev->devnum << 8) | (endpoint << 15); -} - -/* Create various pipes... */ -#define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) - -/* -------------------------------------------------------------------------- */ - -/* - * Debugging and troubleshooting/diagnostic helpers. - */ -void usb_show_device_descriptor(struct usb_device_descriptor *); -void usb_show_config_descriptor(struct usb_config_descriptor *); -void usb_show_interface_descriptor(struct usb_interface_descriptor *); -void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *); -void usb_show_device(struct usb_device *); -void usb_show_string(struct usb_device *dev, char *id, int index); - -#ifdef DEBUG -#define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg) -#else -#define dbg(format, arg...) do {} while (0) -#endif - - - -#ifdef DEBUG_MODE -#define info(format, arg...) printk(KERN_INFO __FILE__ ": " format "\n" , ## arg) -#define err(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg) -#define warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ## arg) -#endif - -#ifndef DEBUG_MODE -#define info(format, arg...) do {} while (0) -#define err(format, arg...) do {} while (0) -#define warn(format, arg...) do {} while (0) -#endif - -#endif /* __KERNEL__ */ - -#endif diff --git a/lib/usb/include/linux/usb_ch9.h b/lib/usb/include/linux/usb_ch9.h deleted file mode 100644 index 109ec384d..000000000 --- a/lib/usb/include/linux/usb_ch9.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - * This file holds USB constants and structures that are needed for USB - * device APIs. These are used by the USB device model, which is defined - * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C - * that need these: - * - * - the master/host side Linux-USB kernel driver API; - * - the "usbfs" user space API; and - * - (eventually) a Linux "gadget" slave/device side driver API. - * - * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems - * act either as a USB master/host or as a USB slave/device. That means - * the master and slave side APIs will benefit from working well together. - */ - -#ifndef __LINUX_USB_CH9_H -#define __LINUX_USB_CH9_H -#if 0 -#include /* __u8 etc */ -#endif -/*-------------------------------------------------------------------------*/ - -/* CONTROL REQUEST SUPPORT */ - -/* - * USB directions - * - * This bit flag is used in endpoint descriptors' bEndpointAddress field. - * It's also one of three fields in control requests bRequestType. - */ -#define USB_DIR_OUT 0 /* to device */ -#define USB_DIR_IN 0x80 /* to host */ - -/* - * USB types, the second of three bRequestType fields - */ -#define USB_TYPE_MASK (0x03 << 5) -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -/* - * USB recipients, the third of three bRequestType fields - */ -#define USB_RECIP_MASK 0x1f -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -/* - * Standard requests, for the bRequest field of a SETUP packet. - * - * These are qualified by the bRequestType field, so that for example - * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved - * by a GET_STATUS request. - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - - -/** - * struct usb_ctrlrequest - SETUP data for a USB device control request - * @bRequestType: matches the USB bmRequestType field - * @bRequest: matches the USB bRequest field - * @wValue: matches the USB wValue field (le16 byte order) - * @wIndex: matches the USB wIndex field (le16 byte order) - * @wLength: matches the USB wLength field (le16 byte order) - * - * This structure is used to send control requests to a USB device. It matches - * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the - * USB spec for a fuller description of the different fields, and what they are - * used for. - * - * Note that the driver for any interface can issue control requests. - * For most devices, interfaces don't coordinate with each other, so - * such requests may be made at any time. - */ -struct usb_ctrlrequest { - __u8 bRequestType; - __u8 bRequest; - __u16 wValue; - __u16 wIndex; - __u16 wLength; -} __attribute__ ((packed)); - -/*-------------------------------------------------------------------------*/ - -/* - * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or - * (rarely) accepted by SET_DESCRIPTOR. - * - * Note that all multi-byte values here are encoded in little endian - * byte order "on the wire". But when exposed through Linux-USB APIs, - * they've been converted to cpu byte order. - */ - -/* - * Descriptor types ... USB 2.0 spec table 9.5 - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 -#define USB_DT_DEVICE_QUALIFIER 0x06 -#define USB_DT_OTHER_SPEED_CONFIG 0x07 -#define USB_DT_INTERFACE_POWER 0x08 - -/* All standard descriptors have these 2 fields at the beginning */ -struct usb_descriptor_header { - __u8 bLength; - __u8 bDescriptorType; -} __attribute__ ((packed)); - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEVICE: Device descriptor */ -struct usb_device_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u16 bcdUSB; - __u8 bDeviceClass; - __u8 bDeviceSubClass; - __u8 bDeviceProtocol; - __u8 bMaxPacketSize0; - __u16 idVendor; - __u16 idProduct; - __u16 bcdDevice; - __u8 iManufacturer; - __u8 iProduct; - __u8 iSerialNumber; - __u8 bNumConfigurations; -} __attribute__ ((packed)); - -#define USB_DT_DEVICE_SIZE 18 - - -/* - * Device and/or Interface Class codes - * as found in bDeviceClass or bInterfaceClass - * and defined by www.usb.org documents - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PHYSICAL 5 -#define USB_CLASS_STILL_IMAGE 6 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_CDC_DATA 0x0a -#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ -#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ -#define USB_CLASS_APP_SPEC 0xfe -#define USB_CLASS_VENDOR_SPEC 0xff - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_CONFIG: Configuration descriptor information. - * - * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the - * descriptor type is different. Highspeed-capable devices can look - * different depending on what speed they're currently running. Only - * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG - * descriptors. - */ -struct usb_config_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u16 wTotalLength; - __u8 bNumInterfaces; - __u8 bConfigurationValue; - __u8 iConfiguration; - __u8 bmAttributes; - __u8 bMaxPower; -} __attribute__ ((packed)); - -#define USB_DT_CONFIG_SIZE 9 - -/* from config descriptor bmAttributes */ -#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ -#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ -#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_STRING: String descriptor */ -struct usb_string_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u16 wData[1]; /* UTF-16LE encoded */ -} __attribute__ ((packed)); - -/* note that "string" zero is special, it holds language codes that - * the device supports, not Unicode characters. - */ - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_INTERFACE: Interface descriptor */ -struct usb_interface_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u8 bInterfaceNumber; - __u8 bAlternateSetting; - __u8 bNumEndpoints; - __u8 bInterfaceClass; - __u8 bInterfaceSubClass; - __u8 bInterfaceProtocol; - __u8 iInterface; -} __attribute__ ((packed)); - -#define USB_DT_INTERFACE_SIZE 9 - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_ENDPOINT: Endpoint descriptor */ -struct usb_endpoint_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u8 bEndpointAddress; - __u8 bmAttributes; - __u16 wMaxPacketSize; - __u8 bInterval; - - // NOTE: these two are _only_ in audio endpoints. - // use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. - __u8 bRefresh; - __u8 bSynchAddress; -} __attribute__ ((packed)); - -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ - - -/* - * Endpoints - */ -#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ -struct usb_qualifier_descriptor { - __u8 bLength; - __u8 bDescriptorType; - - __u16 bcdUSB; - __u8 bDeviceClass; - __u8 bDeviceSubClass; - __u8 bDeviceProtocol; - __u8 bMaxPacketSize0; - __u8 bNumConfigurations; - __u8 bRESERVED; -} __attribute__ ((packed)); - - -/*-------------------------------------------------------------------------*/ - -/* USB 2.0 defines three speeds, here's how Linux identifies them */ - -enum usb_device_speed { - USB_SPEED_UNKNOWN = 0, /* enumerating */ - USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ - USB_SPEED_HIGH /* usb 2.0 */ -}; - -enum usb_device_state { - /* NOTATTACHED isn't in the USB spec, and this state acts - * the same as ATTACHED ... but it's clearer this way. - */ - USB_STATE_NOTATTACHED = 0, - - /* the chapter 9 device states */ - USB_STATE_ATTACHED, - USB_STATE_POWERED, - USB_STATE_DEFAULT, /* limited function */ - USB_STATE_ADDRESS, - USB_STATE_CONFIGURED, /* most functions */ - - USB_STATE_SUSPENDED - - /* NOTE: there are actually four different SUSPENDED - * states, returning to POWERED, DEFAULT, ADDRESS, or - * CONFIGURED respectively when SOF tokens flow again. - */ -}; - -#endif /* __LINUX_USB_CH9_H */ diff --git a/lib/usb/include/linux_wrapper.h b/lib/usb/include/linux_wrapper.h deleted file mode 100644 index 47a0b80fa..000000000 --- a/lib/usb/include/linux_wrapper.h +++ /dev/null @@ -1,787 +0,0 @@ -/* - * linux-wrapper.h - * - * Hard coded Linux kernel replacements for x86 - * - * (c) 2003 Georg Acher (georg@acher.org) - * - * Emulation of: - * typedefs - * structs - * macros - * - * All structs and prototypes are based on kernel source 2.5.72 - * - * #include - */ - -/*------------------------------------------------------------------------*/ -/* Typedefs */ -/*------------------------------------------------------------------------*/ -#include "cromwell_types.h" -#include - -typedef unsigned int __u32; -//typedef __u32 u32; -typedef unsigned short __u16; -//typedef __u16 u16; -typedef unsigned char __u8; -//typedef __u8 u8; - -typedef int pid_t; - -typedef short s16; - -typedef u32 dma_addr_t; - -typedef int spinlock_t; -typedef int atomic_t; -#ifndef STANDALONE -//typedef int mode_t; -//typedef int pid_t; -//typedef int ssize_t; - -#endif -typedef int irqreturn_t; -typedef unsigned long kernel_ulong_t; - -typedef int wait_queue_head_t; -/*------------------------------------------------------------------------*/ -/* Stuff from xbox/linux environment */ -/*------------------------------------------------------------------------*/ - -#include "list.h" - -#ifndef STANDALONE -#ifdef MODULE -typedef int size_t; -#define NULL ((void*)0) -extern void * memset(void *,int,unsigned int); -extern void * memcpy(void *,const void *,unsigned int); -#if 0 -extern char * strcpy(char *,const char *); -#else -static inline char * strcpy(char * dest,const char *src) -{ -int d0, d1, d2; -__asm__ __volatile__( - "1:\tlodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b" - : "=&S" (d0), "=&D" (d1), "=&a" (d2) - :"0" (src),"1" (dest) : "memory"); -return dest; -} -#endif -extern size_t strlen(const char *); - -extern int memcmp(const void *,const void *,unsigned int); - -#else -#include "boot.h" -#include "config.h" -#endif -#else -#include -#include -#include -#include "consts.h" -#include -#endif - -/*------------------------------------------------------------------------*/ -/* General structs */ -/*------------------------------------------------------------------------*/ - -struct timer_list { - void (*function)(unsigned long); - unsigned long data; - int expires; - struct list_head timer_list; -}; - -struct work_struct { - void (*func)(void *); -}; -struct device { - char name[128]; - struct bus_type *bus; - int dma_mask; - char bus_id[16]; - struct device_driver* driver; - void *driver_data; - struct device *parent; - struct list_head driver_list; - void (*release)(struct device * dev); -}; -struct class_device{int a;}; -struct semaphore{int a;}; - -struct device_driver{ - char *name; - struct bus_type *bus; - int (*probe) (struct device * dev); - int (*remove) (struct device * dev); - struct list_head devices; -}; - -struct bus_type { - char * name; - int (*match)(struct device * dev, struct device_driver * drv); - struct device * (*add) (struct device * parent, char * bus_id); - int (*hotplug) (struct device *dev, char **envp, - int num_envp, char *buffer, int buffer_size); -}; - -struct dummy_process -{ - int flags; -}; - -struct pt_regs -{ - int a; -}; -struct completion { - unsigned int done; - wait_queue_head_t wait; -}; - -/* from mod_devicetable.h */ - -struct usb_device_id { - /* which fields to match against? */ - __u16 match_flags; - - /* Used for product specific matches; range is inclusive */ - __u16 idVendor; - __u16 idProduct; - __u16 bcdDevice_lo; - __u16 bcdDevice_hi; - - /* Used for device class matches */ - __u8 bDeviceClass; - __u8 bDeviceSubClass; - __u8 bDeviceProtocol; - - /* Used for interface class matches */ - __u8 bInterfaceClass; - __u8 bInterfaceSubClass; - __u8 bInterfaceProtocol; - - /* not matched against */ - kernel_ulong_t driver_info; -}; - -/* Some useful macros to use to create struct usb_device_id */ -#define USB_DEVICE_ID_MATCH_VENDOR 0x0001 -#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002 -#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004 -#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008 -#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010 -#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020 -#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040 -#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080 -#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100 -#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200 - -/*------------------------------------------------------------------------*/ -/* imported functions from top-level */ -/*------------------------------------------------------------------------*/ - -void zxprintf(char* fmt, ...); -void zxsprintf(char *buffer, char* fmt, ...); -int zxsnprintf(char *buffer, size_t s, char* fmt, ...); - -/*------------------------------------------------------------------------*/ -/* PCI structs (taken from linux/pci.h et al., but slightly modified) */ -/*------------------------------------------------------------------------*/ - -struct pci_dev { - int vendor; - int device; - struct pci_bus *bus; - int irq; - char *slot_name; - struct device dev; - int base[4]; - int flags[4]; - void * data; -}; - -struct pci_bus { - unsigned char number; -}; - -struct pci_device_id { - __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/ - __u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */ - __u32 class, class_mask; /* (class,subclass,prog-if) triplet */ - kernel_ulong_t driver_data; /* Data private to the driver */ -}; - -struct pci_driver { - struct list_head node; - char *name; - const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ - int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ - void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ - int (*save_state) (struct pci_dev *dev, u32 state); /* Save Device Context */ - int (*suspend) (struct pci_dev *dev, u32 state); /* Device suspended */ - int (*resume) (struct pci_dev *dev); /* Device woken up */ - int (*enable_wake) (struct pci_dev *dev, u32 state, int enable); /* Enable wake event */ -}; - -struct scatterlist -{ - int page; - int offset; - int length; -}; - -struct usbdevfs_hub_portinfo -{ - int nports; - int port[8]; -}; - -/*------------------------------------------------------------------------*/ -/* constant defines */ -/*------------------------------------------------------------------------*/ - -#define TASK_UNINTERRUPTIBLE 0 -#define HZ 100 /* Don't rely on that... */ -#define KERN_DEBUG "DBG: " -#define KERN_ERR "ERR: " -#define KERN_WARNING "WRN: " -#define KERN_INFO "INF: " -#define GFP_KERNEL 0 -#define GFP_ATOMIC 0 -#define GFP_NOIO 0 -#define SLAB_ATOMIC 0 -#define PCI_ANY_ID (~0) -#define SIGKILL 9 -#define THIS_MODULE 0 -#define PAGE_SIZE 4096 - - -#define CLONE_FS 0 -#define CLONE_FILES 0 -#define CLONE_SIGHAND 0 -#define PF_FREEZE 0 -#define PF_IOTHREAD 0 - - -#define USBDEVFS_HUB_PORTINFO 1234 -#define SA_SHIRQ 0 - -#undef PCI_COMMAND -#define PCI_COMMAND 0 -#undef PCI_COMMAND_MASTER -#define PCI_COMMAND_MASTER 0 -/*------------------------------------------------------------------------*/ -/* Module/export macros */ -/*------------------------------------------------------------------------*/ - -#define MODULE_AUTHOR(a) -#define MODULE_DESCRIPTION(a) -#define MODULE_LICENSE(a) -#define MODULE_DEVICE_TABLE(type,name) const void* module_table_##name=&name - -#define __devinit -#define __exit -#define __init -#define __devinitdata -#define module_init(x) static void module_init_##x(void){ x();} -#define module_exit(x) void module_exit_##x(void){ x();} -#define EXPORT_SYMBOL_GPL(x) -#define EXPORT_SYMBOL(x) - -#define __setup(x,y) int setup_##y=(int)y -#define subsys_initcall(x) void subsys_##x(void){x();} - -/*------------------------------------------------------------------------*/ -/* Access macros */ -/*------------------------------------------------------------------------*/ - -#define dev_get_drvdata(a) (a)->driver_data -#define dev_set_drvdata(a,b) (a)->driver_data=(b) - -#define __io_virt(x) ((void *)(x)) -#define readl(addr) (*(volatile unsigned int *) __io_virt(addr)) -#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b)) -#define likely(x) (x) -#define unlikely(x) (x) -#define prefetch(x) 1 - -/* The kernel macro for list_for_each_entry makes nonsense (have no clue - * why, this is just the same definition...) */ - -#undef list_for_each_entry -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - prefetch(pos->member.next); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member), \ - prefetch(pos->member.next)) - -/*------------------------------------------------------------------------*/ -/* function wrapper macros */ -/*------------------------------------------------------------------------*/ -void *malloc2(size_t s); -void free2(void *x); - -#define kmalloc(x,y) malloc2(x) -#define kfree(x) free2(x) - -//#define kmalloc(x,y) malloc(x) -//#define kfree(x) free(x) - -//#define sprintf(a,b,format, arg...) zxsprintf((a),(b),format, ## arg) -//#define snprintf(a,b,format, arg...) zxsnprintf((a),(b),format, ##arg) -#define printk(format, arg...) //zxprintf(format, ## arg) -#define BUG(...) do {} while(0) - -/* Locks & friends */ - -#define DECLARE_MUTEX(x) struct semaphore x -#define init_MUTEX(x) - -#define SPIN_LOCK_UNLOCKED 0 -#define spin_lock_init(a) do {} while(0) -#define spin_lock(a) *(int*)a=1 -#define spin_unlock(a) do {} while(0) - -#define spin_lock_irqsave(a,b) b=0 -#define spin_unlock_irqrestore(a,b) - -#if 0 -#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory") -#define local_irq_restore(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc") -#else -#define local_irq_save(x) do {} while(0) -#define local_irq_restore(x) do {} while(0) -#endif - -#define atomic_inc(x) *(x)+=1 -#define atomic_dec(x) *(x)-=1 -#define atomic_dec_and_test(x) (*(x)-=1,(*(x))==0) -#define atomic_set(x,a) *(x)=a -#define atomic_read(x) *(x) -#define ATOMIC_INIT(x) (x) - -#define down(x) do {} while(0) -#define up(x) do {} while(0) -#define down_trylock(a) 0 - -#define down_read(a) do {} while(0) -#define up_read(a) do {} while(0) - -#define DECLARE_WAIT_QUEUE_HEAD(x) int x - -#define DECLARE_COMPLETION(x) struct completion x - -/* driver */ - -#define driver_unregister(a) do {} while(0) -#define put_device(a) do {} while(0) - - -/* PCI */ -#define pci_pool_create(a,b,c,d,e) (void*)1 - -#define pci_pool_alloc(a,b,c) my_pci_pool_alloc(a,b,c) - -static void __inline__ *my_pci_pool_alloc(void* pool, size_t size, - dma_addr_t *dma_handle) -{ -// void* a; -// a=kmalloc(size,0); //FIXME -//#ifdef MODULE -// *dma_handle=((u32)a)&0xfffffff; -//#else -// *dma_handle=(u32)a; -//#endif -// return a; - - void* a; - a=(void *)kmalloc(size,0); //FIXME - *dma_handle=(u32)MmGetPhysicalAddress(a); - return a; -} - - -#define pci_pool_free(a,b,c) kfree(b) -#define pci_alloc_consistent(a,b,c) my_pci_alloc_consistent(a,b,c) - -static void __inline__ *my_pci_alloc_consistent(struct pci_dev *hwdev, size_t size, - dma_addr_t *dma_handle) -{ -// void* a; -// -// a=kmalloc(size+256,0); //FIXME -// a=(void*)(((int)a+255)&~255); // 256 alignment -// //*dma_handle=((u32)a)&0xfffffff; -//#ifdef MODULE -// *dma_handle=((u32)a)&0xfffffff; -//#else -// *dma_handle=(u32)a; -//#endif -// -// return a; - - void* a; - - a=(void *)kmalloc(size,0); //FIXME - *dma_handle=(u32)MmGetPhysicalAddress(a); - - return a; -} - -#define pci_free_consistent(a,b,c,d) kfree(c) -#define pci_pool_destroy(a) do {} while(0) - -#define pci_module_init(x) my_pci_module_init(x) -int my_pci_module_init(struct pci_driver *x); - -#define pci_unregister_driver(a) do {} while(0) - -#define bus_register(a) do {} while(0) -#define bus_unregister(a) do {} while(0) - -#define dma_map_single(a,b,c,d) ((u32)(b)&0xfffffff) -#define dma_unmap_single(a,b,c,d) do {} while(0) -#define pci_unmap_single(a,b,c,d) do {} while(0) -#define dma_sync_single(a,b,c,d) do {} while(0) -#define dma_sync_sg(a,b,c,d) do {} while(0) -#define dma_map_sg(a,b,c,d) 0 -#define dma_unmap_sg(a,b,c,d) do {} while(0) - -#define usb_create_driverfs_dev_files(a) do {} while(0) -#define usb_create_driverfs_intf_files(a) do {} while(0) -#define sg_dma_address(x) ((u32)((x)->page*4096 + (x)->offset)) -#define sg_dma_len(x) ((x)->length) - -#define page_address(x) ((void*)(x/4096)) - -#define DMA_TO_DEVICE 0 -#define DMA_FROM_DEVICE 0 -#define PCI_DMA_TODEVICE -#define PCI_DMA_FROMDEVICE -#define PCI_DMA_TODEVICE - -#define PCI_ROM_RESOURCE 0 -#define IORESOURCE_IO 1 - -#define DECLARE_WAITQUEUE(a,b) wait_queue_head_t a=0 -#define init_waitqueue_head(a) do {} while(0) -#define add_wait_queue(a,b) do {} while(0) -#define remove_wait_queue(a,b) do {} while(0) - -#define wmb() __asm__ __volatile__ ("": : :"memory") -#define rmb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory") - -#define in_interrupt() 0 - -#define init_completion(x) (x)->done=0 -#define wait_for_completion(x) my_wait_for_completion(x) -void my_wait_for_completion(struct completion*); - -#define IRQ_NONE 0 -#define IRQ_HANDLED 1 - -#define INIT_WORK(a,b,c) (a)->func=b - -#define set_current_state(a) do {} while(0) - -#define might_sleep() do {} while(0) -#define daemonize(a) do {} while(0) -#define allow_signal(a) do {} while(0) -#define wait_event_interruptible(x,y) do {} while(0) -#define flush_scheduled_work() do {} while(0) -#define refrigerator(x) do {} while(0) -#define signal_pending(x) 1 // fall through threads -#define complete_and_exit(a,b) return 0 - -#define kill_proc(a,b,c) 0 -#define yield() do {} while(0) -#define cpu_relax() do {} while(0) - -/*------------------------------------------------------------------------*/ -/* Kernel macros */ -/*------------------------------------------------------------------------*/ - -#define LINUX_VERSION_CODE 0x020572 -#define UTS_SYSNAME "XBOX" -#define UTS_RELEASE "----" - -/* from linux/kernel.h */ -#define max_t(type,x,y) \ - ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; }) - -#define min_t(type,x,y) \ - ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) - -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -/* from linux/stddef.h */ - -#undef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) - -/*------------------------------------------------------------------------*/ -/* Conversion macros */ -/*------------------------------------------------------------------------*/ - -#define __constant_cpu_to_le32(x) (x) -#define cpu_to_le16(x) (x) -#define le16_to_cpu(x) (x) -#define cpu_to_le32(x) (x) -#define cpu_to_le32p(x) (*(__u32*)(x)) -#define le32_to_cpup(x) (*(__u32*)(x)) -#define le32_to_cpu(x) ((u32)x) -#define le16_to_cpus(x) do {} while (0) -#define le16_to_cpup(x) (*(__u16*)(x)) -#define cpu_to_le16p(x) (*(__u16*)(x)) - -/*------------------------------------------------------------------------*/ -/* Debug output */ -/*------------------------------------------------------------------------*/ -#ifdef DEBUG_MODE -#define dev_printk(lvl,x,f,arg...) printk(f, ## arg) -#define dev_dbg(x,f,arg...) do {} while (0) //printk(f, ## arg) -#define dev_info(x,f,arg...) printk(f,## arg) -#define dev_warn(x,f,arg...) printk(f,## arg) -#define dev_err(x,f,arg...) printk(f,## arg) -#define pr_debug(x,f,arg...) printk(f,## arg) -#define usbprintk printk -#endif - -#ifndef DEBUG_MODE -#define dev_printk(lvl,x,f,arg...) do {} while (0) -#define dev_dbg(x,f,arg...) do {} while (0) //printk(f, ## arg) -#define dev_info(x,f,arg...) do {} while (0) -#define dev_warn(x,f,arg...) do {} while (0) -#define dev_err(x,f,arg...) do {} while (0) -#define pr_debug(x,f,arg...) do {} while (0) -#define usbprintk(f,arg...) -#endif - - - -#define PCI_DEVFN(a,b) 0 -#define PCI_SLOT(a) 0 - -/*------------------------------------------------------------------------*/ -/* Stuff from kernel */ -/*------------------------------------------------------------------------*/ - -#include "asm/errno.h" -#include "linux/bitops.h" -#include "linux/pci_ids.h" - -/*------------------------------------------------------------------------*/ -/* global variables */ -/*------------------------------------------------------------------------*/ - -#define jiffies my_jiffies -extern int my_jiffies; -#define current my_current -extern struct dummy_process *my_current; - -extern struct list_head interrupt_list; - -/*------------------------------------------------------------------------*/ -/* Function prototypes */ -/*------------------------------------------------------------------------*/ -void usb_hcd_pci_remove (struct pci_dev *dev); - -#define wait_ms(x) my_wait_ms(x) -void my_wait_ms(unsigned int ms); - -#define udelay(x) my_udelay(x) -void my_udelay(unsigned int a); - -#define mdelay(x) my_mdelay(x); -void my_mdelay(unsigned int a); - -#define pci_find_slot(a,b) my_pci_find_slot(a,b) -struct pci_dev *my_pci_find_slot(int a,int b); - -/*------------------------------------------------------------------------*/ -/* Timer management */ -/*------------------------------------------------------------------------*/ - -#define MAX_TIMERS 20 -extern struct timer_list *main_timer_list[MAX_TIMERS]; - -static void __inline__ init_timer(struct timer_list* t) -{ - INIT_LIST_HEAD(&t->timer_list); - t->function=NULL; - t->expires=0; -} - -static void __inline__ add_timer(struct timer_list* t) -{ - int n; - for(n=0;nexpires=ex; - add_timer(t); -} - -/*------------------------------------------------------------------------*/ -/* Device driver and process related stuff */ -/*------------------------------------------------------------------------*/ - -static int __inline__ usb_major_init(void){return 0;} -static void __inline__ usb_major_cleanup(void){} -static void __inline__ schedule_work(void* p){} - -#define device_initialize(x) my_device_initialize(x) -void my_device_initialize(struct device *dev); - -#define get_device(x) my_get_device(x) -struct device *my_get_device(struct device *dev); - -#define device_add(x) my_device_add(x) -int my_device_add(struct device *dev); - -#define driver_register(x) my_driver_register(x) -int my_driver_register(struct device_driver *driver); - -#define device_unregister(a) my_device_unregister(a) -int my_device_unregister(struct device *dev); - -#define DEVICE_ATTR(a,b,c,d) int xxx_##a -#define device_create_file(a,b) do {} while(0) -#define device_remove_file(a,b) do {} while(0) - -#define schedule_timeout(x) my_schedule_timeout(x) -int my_schedule_timeout(int x); - -#define wake_up(x) my_wake_up(x) -void my_wake_up(void*); - -// cannot be mapped via macro due to collision with urb->complete -static void __inline__ complete(struct completion *p) -{ - /* Wake up x->wait */ - p->done++; - wake_up(&p->wait); -} - -#define kernel_thread(a,b,c) my_kernel_thread(a,b,c) -int my_kernel_thread(int (*handler)(void*), void* parm, int flags); - -/*------------------------------------------------------------------------*/ -/* PCI, simple and inlined... */ -/*------------------------------------------------------------------------*/ -static int __inline__ pci_enable_device(struct pci_dev *dev) {return 0;} - -static unsigned long __inline__ pci_resource_start (struct pci_dev *dev, int x) -{ - return dev->base[x]; -} - -static unsigned long __inline__ pci_resource_len (struct pci_dev *dev, int x){return 0;} - -static int __inline__ request_mem_region(unsigned long addr, unsigned long len, const char * d){return 1;} - -static void __inline__ *ioremap_nocache(unsigned long addr, unsigned long len) -{ - return (void*)addr; -} - -static int __inline__ release_mem_region(unsigned long addr, unsigned long len){return 0;} - -static int __inline__ pci_resource_flags(struct pci_dev *dev, int x) -{ - return dev->flags[x]; -} - -static int __inline__ request_region(unsigned long addr, unsigned long len, const char * d){return 0;} - -static int __inline__ pci_set_master(struct pci_dev *dev){return 0;} - -static int __inline__ iounmap(void* p){return 0;} - -static int __inline__ release_region(unsigned long addr, unsigned long len){return 0;} - -static int __inline__ pci_set_drvdata(struct pci_dev *dev, void* d) -{ - dev->data=(void*)d; - return 0; -} - -static void __inline__ *pci_get_drvdata(struct pci_dev *dev) -{ - return dev->data; -} - -/*------------------------------------------------------------------------*/ -/* IRQ handling */ -/*------------------------------------------------------------------------*/ - -#define request_irq(a,b,c,d,e) my_request_irq(a,b,c,d,e) -int my_request_irq(unsigned int irq, - int (*handler)(int, void *, struct pt_regs *), - unsigned long mode, const char *desc, void *data); - -#define free_irq(a,b) my_free_irq(a,b) -int free_irq(int irq, void* p); - - - -struct my_irqs { - int (*handler)(int, void *, struct pt_regs *); - int irq; - void* data; -}; - -#define MAX_IRQS 8 - -// Exported to top level - -void handle_irqs(int irq); -void inc_jiffies(int); -void init_wrapper(void); -void do_all_timers(void); - -#define __KERNEL_DS 0x18 - - diff --git a/lib/usb/include/list.h b/lib/usb/include/list.h deleted file mode 100644 index ef8fdd29f..000000000 --- a/lib/usb/include/list.h +++ /dev/null @@ -1,224 +0,0 @@ -#ifndef _BOOT_LIST_H -#define _BOOT_LIST_H - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists rather than single entries, as - * sometimes we already know the next/prev entries and we can - * generate better code by using them directly rather than - * using the generic single-entry routines. - */ - -struct list_head { - struct list_head *next, *prev; -}; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define INIT_LIST_HEAD(ptr) do { \ - (ptr)->next = (ptr); (ptr)->prev = (ptr); \ -} while (0) - -/* - * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static inline void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head *prev, struct list_head *next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty on entry does not return true after this, the entry is in an undefined state. - */ -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = (void *) 0; - entry->prev = (void *) 0; -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static inline void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_move - delete from one list and add as another's head - * @list: the entry to move - * @head: the head that will precede our entry - */ -static inline void list_move(struct list_head *list, struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add(list, head); -} - -/** - * list_move_tail - delete from one list and add as another's tail - * @list: the entry to move - * @head: the head that will follow our entry - */ -static inline void list_move_tail(struct list_head *list, - struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add_tail(list, head); -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static inline int list_empty(struct list_head *head) -{ - return head->next == head; -} - -static inline void __list_splice(struct list_head *list, - struct list_head *head) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - struct list_head *at = head->next; - - first->prev = head; - head->next = first; - - last->next = at; - at->prev = last; -} - -/** - * list_splice - join two lists - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice(struct list_head *list, struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head); -} - -/** - * list_splice_init - join two lists and reinitialise the emptied list. - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * The list at @list is reinitialised - */ -static inline void list_splice_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head); - INIT_LIST_HEAD(list); - } -} - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); \ - pos = pos->next) -/** - * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; pos != (head); \ - pos = pos->prev) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - -/** - * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member) \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -#endif diff --git a/lib/usb/include/usblib.h b/lib/usb/include/usblib.h deleted file mode 100644 index a48e3af62..000000000 --- a/lib/usb/include/usblib.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _USBLIB_H -#define _USBLIB_H - -#include "cromwell_types.h" - -void BootStopUSB(void); -void BootStartUSB(void); -void USBGetEvents(void); - -void UsbKeyBoardInit(void); -void UsbKeyBoardRemove(void); - -void wait_ms(u32 ticks); -void wait_us(u32 ticks); - -#endif diff --git a/lib/usb/include/xremote.h b/lib/usb/include/xremote.h deleted file mode 100644 index ab22aab7a..000000000 --- a/lib/usb/include/xremote.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _XREMOTE_H_ -#define _XREMOTE_H_ - -extern u16 current_remote_key; -extern u8 remotekeyIsRepeat; - -#define RC_KEY_SELECT 0x0b0a -#define RC_KEY_UP 0xa60a -#define RC_KEY_DOWN 0xa70a -#define RC_KEY_RIGHT 0xa80a -#define RC_KEY_LEFT 0xa90a -#define RC_KEY_INFO 0xc30a -#define RC_KEY_9 0xc60a -#define RC_KEY_8 0xc70a -#define RC_KEY_7 0xc80a -#define RC_KEY_6 0xc90a -#define RC_KEY_5 0xca0a -#define RC_KEY_4 0xcb0a -#define RC_KEY_3 0xcc0a -#define RC_KEY_2 0xcd0a -#define RC_KEY_1 0xce0a -#define RC_KEY_0 0xcf0a -#define RC_KEY_DISPLAY 0xd50a -#define RC_KEY_BACK 0xd80a -#define RC_KEY_SKIPF 0xdd0a -#define RC_KEY_SKIPB 0xdf0a -#define RC_KEY_STOP 0xe00a -#define RC_KEY_REW 0xe20a -#define RC_KEY_FWD 0xe30a -#define RC_KEY_TITLE 0xe50a -#define RC_KEY_PAUSE 0xe60a -#define RC_KEY_PLAY 0xea0a -#define RC_KEY_MENU 0xf70a - -#endif diff --git a/lib/usb/libusbohci b/lib/usb/libusbohci new file mode 160000 index 000000000..b9f167224 --- /dev/null +++ b/lib/usb/libusbohci @@ -0,0 +1 @@ +Subproject commit b9f167224ea092241ef6ec4d06cea819dfdda0a5 diff --git a/lib/usb/libusbohci_xbox/usbh_config_xbox.h b/lib/usb/libusbohci_xbox/usbh_config_xbox.h new file mode 100644 index 000000000..f80b406a2 --- /dev/null +++ b/lib/usb/libusbohci_xbox/usbh_config_xbox.h @@ -0,0 +1,96 @@ +/**************************************************************************//** + * @file usbh_config_xbox.h + * @version V1.00 + * @brief This header file defines the configuration of USB Host library. + * @note + * SPDX-License-Identifier: Apache-2.0 + * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved. + * Copyright (C) 2021 Ryan Wendland (Xbox port) + *****************************************************************************/ + +#ifndef _USBH_CONFIG_H_ +#define _USBH_CONFIG_H_ + +/*----------------------------------------------------------------------------------------*/ +/* Hardware settings */ +/*----------------------------------------------------------------------------------------*/ +#define NON_CACHE_MASK 0 +#define USB_IRQ 1 +#define ENABLE_OHCI_IRQ() _ohci->HcInterruptEnable |= USBH_HcInterruptEnable_MIE_Msk +#define DISABLE_OHCI_IRQ() _ohci->HcInterruptDisable = USBH_HcInterruptDisable_MIE_Msk +#define IS_OHCI_IRQ_ENABLED() ((_ohci->HcInterruptEnable & USBH_HcInterruptEnable_MIE_Msk) !=0) +#define ENABLE_EHCI_IRQ() +#define DISABLE_EHCI_IRQ() +#define IS_EHCI_IRQ_ENABLED() 0 + +#define ENABLE_OHCI /* Enable OHCI host controller */ +#define OHCI_PORT_CNT 4 /* Number of OHCI roothub ports */ +//#define OHCI_PER_PORT_POWER /* OHCI root hub per port powered */ + +#define OHCI_ISO_DELAY 4 /* preserved number frames while scheduling + OHCI isochronous transfer */ + +#define MAX_DESC_BUFF_SIZE 4096 /* To hold the configuration descriptor, USB + core will allocate a buffer with this size + for each connected device. USB core does + not release it until device disconnected. */ + +/*----------------------------------------------------------------------------------------*/ +/* Memory allocation settings */ +/*----------------------------------------------------------------------------------------*/ +#ifndef MAX_UDEV_DRIVER +#define MAX_UDEV_DRIVER 8 /*!< Maximum number of registered drivers */ +#endif +#ifndef MAX_ALT_PER_IFACE +#define MAX_ALT_PER_IFACE 12 /*!< maximum number of alternative interfaces per interface */ +#endif +#ifndef MAX_EP_PER_IFACE +#define MAX_EP_PER_IFACE 8 /*!< maximum number of endpoints per interface */ +#endif +#ifndef MAX_HUB_DEVICE +#define MAX_HUB_DEVICE 8 /*!< Maximum number of hub devices */ +#endif + +/* Host controller hardware transfer descriptors memory pool. ED/TD/ITD of OHCI + are all allocated from this pool. Allocated unit size is determined by MEM_POOL_UNIT_SIZE. + May allocate one or more units depend on hardware descriptor type. */ +#define MEM_POOL_UNIT_SIZE 128 /*!< A fixed hard coding setting. Do not change it! */ +#ifndef MEM_POOL_UNIT_NUM +//Four S controllers with their internal hub use about 50 'units'. Roughly double it for safe measure +#define MEM_POOL_UNIT_NUM 96 /*!< Increase this or heap size if memory allocate failed. */ +#endif + +/* USB library memory pool for device descriptors, pipe tranfer buffers etc. */ +#ifndef USB_MEMORY_POOL_SIZE +#define USB_MEMORY_POOL_SIZE (512*1024) +#endif + +/*----------------------------------------------------------------------------------------*/ +/* Debug settings */ +/*----------------------------------------------------------------------------------------*/ +//#define ENABLE_ERROR_MSG /* enable debug messages */ +//#define ENABLE_DEBUG_MSG /* enable debug messages */ +//#define ENABLE_VERBOSE_DEBUG /* verbos debug messages */ +//#define DUMP_DESCRIPTOR /* dump descriptors */ + +#ifdef ENABLE_ERROR_MSG +#define USB_error sysprintf +#else +#define USB_error(...) +#endif + +#ifdef ENABLE_DEBUG_MSG +#define USB_debug sysprintf +#ifdef ENABLE_VERBOSE_DEBUG +#define USB_vdebug sysprintf +#else +#define USB_vdebug(...) +#endif +#else +#define USB_debug(...) +#define USB_vdebug(...) +#endif + +#define USBH ((USBH_T *)0xFED00000) +#define HSUSBH ((HSUSBH_T *)NULL) +#endif /* _USBH_CONFIG_H_ */ diff --git a/lib/usb/libusbohci_xbox/usbh_xbox.c b/lib/usb/libusbohci_xbox/usbh_xbox.c new file mode 100644 index 000000000..5c9326ee0 --- /dev/null +++ b/lib/usb/libusbohci_xbox/usbh_xbox.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include "usbh_config_xbox.h" + +extern void OHCI_IRQHandler(void); +static KINTERRUPT InterruptObject; +static BOOLEAN __stdcall ISR(PKINTERRUPT Interrupt, PVOID ServiceContext) +{ + OHCI_IRQHandler(); + return TRUE; +} + +//Initialise the systems ohci irq and irq handler. +//The USB stacks handler function (OHCI_IRQHandler) should be called +void usbh_ohci_irq_init() { + KIRQL irql; + ULONG vector = HalGetInterruptVector(USB_IRQ, &irql); + KeInitializeInterrupt(&InterruptObject, + &ISR, + NULL, + vector, + irql, + LevelSensitive, + FALSE); + KeConnectInterrupt(&InterruptObject); +} + +void usbh_ohci_irq_deinit() { + KeDisconnectInterrupt(&InterruptObject); +} + +//Allocate a contiguous memory pool that the ohci hardware can access. +void *usbh_allocate_memory_pool(uint32_t size, uint32_t boundary) { + return MmAllocateContiguousMemoryEx(size, + 0, + 64 * 1024 * 1024, + boundary, + PAGE_READWRITE | PAGE_NOCACHE); +} + +void usbh_free_memory_pool(void *memory_pool) { + MmFreeContiguousMemory(memory_pool); +} + +//Return the system tick count in 10ms blocks +uint32_t usbh_get_ticks(void) { + return GetTickCount() / 10; +} + +void usbh_delay_us(int usec) { + LARGE_INTEGER duration; + duration.QuadPart = ((LONGLONG)usec) * -10; + while (1) + { + NTSTATUS status = KeDelayExecutionThread(UserMode, FALSE, &duration); + if (status != STATUS_ALERTED) + { + return; + } + } +} + +//Convert a virtual address from the memory pool to a DMAable physical address. +void *usbh_dma_to_virt(void *physical_address) { + if (physical_address == NULL) + return NULL; + + //Already is a virtual address + if (((uint32_t)physical_address & 0x80000000) != 0) + return physical_address; + + return (void *)(0x80000000 | (uint32_t)physical_address); +} + +//Convert a physical address from the ohci hardware to a virtual address. +void *usbh_virt_to_dma(void *virtual_address) { + if ((uint32_t)virtual_address == 0x80000000) + return NULL; + + //Already is a physical address + if (((uint32_t)virtual_address & 0x80000000) == 0) + return virtual_address; + + return (void *)MmGetPhysicalAddress(virtual_address); +} + +void usbh_sysprintf(const char *buffer) +{ + debugPrint(buffer); +} \ No newline at end of file diff --git a/lib/usb/libusbohci_xbox/xid_driver.c b/lib/usb/libusbohci_xbox/xid_driver.c new file mode 100644 index 000000000..54173bab2 --- /dev/null +++ b/lib/usb/libusbohci_xbox/xid_driver.c @@ -0,0 +1,419 @@ +//Copyright 2020, Ryan Wendland +//SPDX-License-Identifier: MIT + +/* + * XID input driver + * This driver is applied with the following Original Xbox Input Devices: + * - Original Xbox gamecontrollers (S, Duke, Wheels, Arcade Sticks etc) + * - Xbox DVD Movie Playback IR Dongle + * - Steel Battalion Controller + * This code should be read in conjuntion with https://xboxdevwiki.net/index.php?title=Xbox_Input_Devices + */ + +#include +#include +#include "usbh_lib.h" +#include "xid_driver.h" + +//#define ENABLE_USBH_XID_DEBUG +#ifdef ENABLE_USBH_XID_DEBUG +#include +#define USBH_XID_DEBUG debugPrint +#else +#define USBH_XID_DEBUG(...) +#endif + +static xid_dev_t xid_devices[CONFIG_XID_MAX_DEV]; +static xid_dev_t *pxid_list = NULL; +static XID_CONN_FUNC *xid_conn_func = NULL, *xid_disconn_func = NULL; + +static xid_dev_t *alloc_xid_device(void) { + xid_dev_t *new_xid = NULL; + for (int i = 0; i < CONFIG_XID_MAX_DEV; i++) + { + if (xid_devices[i].iface == NULL) + { + new_xid = &xid_devices[i]; + break; + } + } + + if (new_xid == NULL) + { + return NULL; + } + + memset(new_xid, 0, sizeof(xid_dev_t)); + new_xid->uid = get_ticks(); + + //Chain the new XID to the end of the list. + if (pxid_list == NULL) + { + pxid_list = new_xid; + } + else + { + xid_dev_t *x; + for (x = pxid_list; x->next != NULL; x = x->next) + ; + x->next = new_xid; + } + + return new_xid; +} + +static void free_xid_device(xid_dev_t *xid_dev) { + //Find the device head in the linked list + xid_dev_t *head = pxid_list; + while (head != NULL && head->next != xid_dev) + { + head = head->next; + } + + //Remove it from the linked list + if (head != NULL) + { + xid_dev_t *new_tail = xid_dev->next; + head->next = new_tail; + } + + //Mark it as free + memset(xid_dev, 0, sizeof(xid_dev_t)); +} + +static int xid_probe(IFACE_T *iface) { + UDEV_T *udev = iface->udev; + xid_dev_t *xid; + DESC_IF_T *ifd = iface->aif->ifd; + + if (ifd->bInterfaceClass != XID_INTERFACE_CLASS || ifd->bInterfaceSubClass != XID_INTERFACE_SUBCLASS) + { + return USBH_ERR_NOT_MATCHED; + } + + xid = alloc_xid_device(); + + if (xid == NULL) + { + return USBH_ERR_MEMORY_OUT; + } + + //Device is an OG Xbox peripheral. + //Get the XID descriptor to find out what type: + xid_descriptor *xid_desc = (xid_descriptor *)usbh_alloc_mem(sizeof(xid_descriptor)); + uint32_t xfer_len; + int32_t ret = usbh_ctrl_xfer(iface->udev, + 0xC1, //bmRequestType + 0x06, //bRequest + 0x4200, //wValue + iface->if_num, //wIndex + sizeof(xid_descriptor), //wLength + (uint8_t *)xid_desc, &xfer_len, 100); + + //Populate the xid device struct. + if (ret != USBH_OK) + { + //Controller didn't respond to control transfer. Likely some unusual 3rd party device. + //Exit for now. + USBH_XID_DEBUG("Error: XID did not have xid descriptor.\n"); + usbh_free_mem(xid_desc, sizeof(xid_descriptor)); + free_xid_device(xid); + return USBH_ERR_NOT_MATCHED; + } + + memcpy(&xid->xid_desc, xid_desc, sizeof(xid_descriptor)); + + xid->iface = iface; + xid->idVendor = udev->descriptor.idVendor; + xid->idProduct = udev->descriptor.idProduct; + xid->next = NULL; + xid->user_data = NULL; + iface->context = (void *)xid; + + usbh_free_mem(xid_desc, sizeof(xid_descriptor)); + +#ifdef ENABLE_USBH_XID_DEBUG + for (int i = 0; i < sizeof(xid_descriptor); i++) + { + USBH_XID_DEBUG("%02x ", ((uint8_t*)&xid->xid_desc)[i]); + } + USBH_XID_DEBUG("\n"); +#endif + + USBH_XID_DEBUG("OG Xbox peripheral type %02x, sub type: %02x connected\n", xid->xid_desc.bType, + xid->xid_desc.bSubType); + + if (xid_conn_func) + { + xid_conn_func(xid, 0); + } + + return USBH_OK; +} + +static void xid_disconnect(IFACE_T *iface) { + xid_dev_t *xid_dev; + UTR_T *utr; + xid_dev = (xid_dev_t *)(iface->context); + + //Stop any running pipe transfers + for (int i = 0; i < iface->aif->ifd->bNumEndpoints; i++) + { + iface->udev->hc_driver->quit_xfer(NULL, &(iface->aif->ep[i])); + } + + //Free any running UTRs + for (int i = 0; i < XID_MAX_TRANSFER_QUEUE; i++) + { + utr = xid_dev->utr_list[i]; + if (utr != NULL) + { + usbh_quit_utr(utr); + usbh_free_mem(utr->buff, utr->ep->wMaxPacketSize); + free_utr(utr); + } + } + + USBH_XID_DEBUG("xid disconnected - device (vid=0x%x, pid=0x%x), interface %d.\n", + xid_dev->idVendor, xid_dev->idProduct, iface->if_num); + + if (xid_disconn_func) + { + xid_disconn_func(xid_dev, 0); + } + + free_xid_device(xid_dev); +} + +UDEV_DRV_T xid_driver = +{ + xid_probe, + xid_disconnect, + NULL, //suspend + NULL, //resume +}; + +/** + * @brief Adds a callback function when an XID interface is connected or removed. Pass NULL to remove the callback. + * + * @param conn_func The user's connection callback function. + * @param disconn_func The user's disconnection callback function. + */ +void usbh_install_xid_conn_callback(XID_CONN_FUNC *conn_func, XID_CONN_FUNC *disconn_func) { + xid_conn_func = conn_func; + xid_disconn_func = disconn_func; +} + +/** + * @brief Initialises the XID driver with the USB backend. + * + */ +void usbh_xid_init(void) { + usbh_register_driver(&xid_driver); +} + +/** + * Returns a pointer to the first connected XID device. This is a linked list + * to all connected XID devices. + * @return A pointer to a xid_dev_t device. + */ +xid_dev_t *usbh_xid_get_device_list(void) { + return pxid_list; +} + +static int32_t queue_int_xfer(xid_dev_t *xid_dev, uint8_t dir, uint8_t ep_addr, uint8_t *buff, uint32_t len, void *callback) { + IFACE_T *iface = (IFACE_T *)xid_dev->iface; + UTR_T *utr = NULL; + int ret, i, free_slot; + + if (iface == NULL || iface->udev == NULL) + { + return USBH_ERR_DISCONNECTED; + } + + EP_INFO_T *ep = usbh_iface_find_ep(iface, ep_addr, dir | EP_ATTR_TT_INT); + if (ep == NULL) + { + return USBH_ERR_EP_NOT_FOUND; + } + + //Clean up finished UTRs in the queue + for (i = 0; i < XID_MAX_TRANSFER_QUEUE; i++) + { + utr = xid_dev->utr_list[i]; + if (utr != NULL && utr->ep != NULL && utr->ep->bEndpointAddress == ep->bEndpointAddress) + { + //Don't queue multiple reads. User is calling faster than controller can update so has no benefit. + if (dir == EP_ADDR_DIR_IN && utr->bIsTransferDone == 0) + { + return HID_RET_XFER_IS_RUNNING; + } + + if (utr->bIsTransferDone) + { + usbh_free_mem(utr->buff, utr->ep->wMaxPacketSize); + free_utr(utr); + xid_dev->utr_list[i] = NULL; + } + } + } + + //Find a free slot in the queue + free_slot = USBH_ERR_MEMORY_OUT; + for (i = 0; i < XID_MAX_TRANSFER_QUEUE; i++) + { + if (xid_dev->utr_list[i] == NULL) + { + free_slot = i; + break; + } + } + + if (free_slot < 0) + { + return free_slot; + } + + utr = alloc_utr(iface->udev); + if (utr == NULL) + { + return USBH_ERR_MEMORY_OUT; + } + + //Populate the new utr + utr->context = xid_dev; + utr->ep = ep; + utr->data_len = (dir == EP_ADDR_DIR_OUT && len < ep->wMaxPacketSize) ? len : ep->wMaxPacketSize; + utr->xfer_len = 0; + utr->func = callback; + utr->buff = usbh_alloc_mem(ep->wMaxPacketSize); + if (utr->buff == NULL) + { + free_utr(utr); + return USBH_ERR_MEMORY_OUT; + } + + if (dir == EP_ADDR_DIR_OUT) + { + memcpy(utr->buff, buff, utr->data_len); + } + + ret = usbh_int_xfer(utr); + if (ret != USBH_OK) + { + usbh_free_mem(utr->buff, ep->wMaxPacketSize); + free_utr(utr); + return ret; + } + + //Register a queued UTR for this device. + xid_dev->utr_list[free_slot] = utr; + + return USBH_OK; +} + +/** + * @brief Reads an interrupt in endpoint. This is a nonblocking function. The received data can be read from the callback function. + * + * @param xid_dev Pointer to the XID device. + * @param ep_addr The endpoint address to read. If ep_addr equal zero, the first interrupt in endpoint found will be used. + * @param rx_complete_callback The user's receive complete callback function with the form `void my_callback(UTR_T *utr)`. + * The received data is read from the user implemented callback function. + * @return USBH_OK or the error. + */ +int32_t usbh_xid_read(xid_dev_t *xid_dev, uint8_t ep_addr, void *rx_complete_callback) { + return queue_int_xfer(xid_dev, EP_ADDR_DIR_IN, ep_addr, NULL, 0, rx_complete_callback); +} + +/** + * @brief Queues a write to an interrupt out endpoint. This is a nonblocking function. The total amount of transfers that can be queued is + * set by XID_MAX_TRANSFER_QUEUE. + * + * @param xid_dev Pointer to the XID device. + * @param ep_addr The endpoint address to write. If ep_addr equal zero, the first interrupt out endpoint found will be used. + * @param txbuff The user transmit buffer + * @param len The number of bytes to transfer + * @param tx_complete_callback Optional transfer complete callback function. + * @return USBH_OK or the error. + */ +int32_t usbh_xid_write(xid_dev_t *xid_dev, uint8_t ep_addr, uint8_t *txbuff, uint32_t len, void *tx_complete_callback) { + return queue_int_xfer(xid_dev, EP_ADDR_DIR_OUT, ep_addr, txbuff, len, tx_complete_callback); +} + +/** + * @brief Send a rumble command to an xid game controller. + * + * @param xid_dev Pointer to the XID device. + * @param l_value Value of the low frequency rumble. 0 to 0xFFFF. + * @param h_value Value of the high frequency rumble. 0 to 0xFFFF. + * @return USBH_OK or the error. + */ +int32_t usbh_xid_rumble(xid_dev_t *xid_dev, uint16_t l_value, uint16_t h_value){ + if (xid_dev->xid_desc.bType != XID_TYPE_GAMECONTROLLER) + { + return USBH_ERR_NOT_SUPPORTED; + } + + xid_gamepad_out command = + { + .startByte = 0, + .bLength = sizeof(xid_gamepad_out), + .lValue = l_value, + .hValue = h_value, + }; + return usbh_xid_write(xid_dev, 0, (uint8_t *)&command, sizeof(xid_gamepad_out), NULL); +} + +/** + * @brief Returns the xid_type. + * + * @param xid_dev Pointer to the XID device. + * @return xid_type. Refer to xid_type enum. + */ +xid_type usbh_xid_get_type(xid_dev_t *xid_dev) +{ + if (xid_dev->xid_desc.bLength == 0) + { + return XID_UNKNOWN; + } + + if (xid_dev->xid_desc.bType == 0x01) + { + switch (xid_dev->xid_desc.bSubType) + { + case 0x01: return GAMECONTROLLER_DUKE; break; + case 0x02: return GAMECONTROLLER_S; break; + case 0x10: return GAMECONTROLLER_WHEEL; break; + case 0x20: return GAMECONTROLLER_ARCADESTICK; break; + default: + USBH_XID_DEBUG("Unknown XID SubType\n"); + return XID_UNKNOWN; + break; + } + } + + if (xid_dev->xid_desc.bType == 0x03) + { + switch (xid_dev->xid_desc.bSubType) + { + case 0x00: return XREMOTE; break; + default: + USBH_XID_DEBUG("Unknown XID SubType\n"); + return XID_UNKNOWN; + } + } + + if (xid_dev->xid_desc.bType == 0x80) + { + switch (xid_dev->xid_desc.bSubType) + { + case 0x01: return STEEL_BATTALION; break; + default: + USBH_XID_DEBUG("Unknown XID SubType\n"); + return XID_UNKNOWN; + } + } + + USBH_XID_DEBUG("Unknown XID Type\n"); + return XID_UNKNOWN; +} diff --git a/lib/usb/libusbohci_xbox/xid_driver.h b/lib/usb/libusbohci_xbox/xid_driver.h new file mode 100644 index 000000000..3d97cbee2 --- /dev/null +++ b/lib/usb/libusbohci_xbox/xid_driver.h @@ -0,0 +1,114 @@ + +//Copyright 2020, Ryan Wendland +//SPDX-License-Identifier: MIT +#ifndef _USBH_XID_H_ +#define _USBH_XID_H_ + +#include "usb.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef CONFIG_XID_MAX_DEV +#define CONFIG_XID_MAX_DEV 4 +#endif +#ifndef XID_MAX_TRANSFER_QUEUE +#define XID_MAX_TRANSFER_QUEUE 4 +#endif +//Ref https://xboxdevwiki.net/index.php?title=Xbox_Input_Devices +#define XID_INTERFACE_CLASS 0x58 +#define XID_INTERFACE_SUBCLASS 0x42 + +struct xid_dev; +typedef void(XID_CONN_FUNC)(struct xid_dev *hdev, int param); + +typedef struct __attribute__((packed)) +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdXid; + uint8_t bType; + uint8_t bSubType; + uint8_t bMaxInputReportSize; + uint8_t bMaxOutputReportSize; + uint16_t wAlternateProductIds[4]; +} xid_descriptor; + +typedef struct __attribute__((packed)) +{ + uint8_t startByte; + uint8_t bLength; + uint16_t dButtons; + uint8_t a; + uint8_t b; + uint8_t x; + uint8_t y; + uint8_t black; + uint8_t white; + uint8_t l; + uint8_t r; + int16_t leftStickX; + int16_t leftStickY; + int16_t rightStickX; + int16_t rightStickY; +} xid_gamepad_in; + +typedef struct __attribute__((packed)) +{ + uint8_t startByte; + uint8_t bLength; + uint16_t lValue; + uint16_t hValue; +} xid_gamepad_out; + +//Ref https://xboxdevwiki.net/Xbox_DVD_Movie_Playback_Kit +typedef struct __attribute__((packed)) +{ + uint8_t startByte; + uint8_t bLength; + uint16_t buttonCode; + uint16_t timeElapsed; //ms since last button press +} xid_xremote_in; + +typedef struct xid_dev +{ + uint16_t idVendor; + uint16_t idProduct; + xid_descriptor xid_desc; //See https://xboxdevwiki.net/index.php?title=Xbox_Input_Devices + UTR_T *utr_list[XID_MAX_TRANSFER_QUEUE]; //UTR list of queued transfers + IFACE_T *iface; //This xid interface + uint32_t uid; //A unique ID to identify this device + struct xid_dev *next; //Pointer to the next xid in the linked list. + void *user_data; //Pointer to an optional user struct +} xid_dev_t; + +//Ref https://xboxdevwiki.net/index.php?title=Xbox_Input_Devices +#define XID_TYPE_GAMECONTROLLER 0x01 +#define XID_TYPE_XREMOTE 0x03 +#define XID_TYPE_STEELBATTALION 0x80 +typedef enum _xid_type +{ + XID_UNKNOWN = 0x0000, + GAMECONTROLLER_S = XID_TYPE_GAMECONTROLLER << 8 | 0x01, + GAMECONTROLLER_DUKE = XID_TYPE_GAMECONTROLLER << 8 | 0x02, + GAMECONTROLLER_WHEEL = XID_TYPE_GAMECONTROLLER << 8 | 0x10, + GAMECONTROLLER_ARCADESTICK = XID_TYPE_GAMECONTROLLER << 8 | 0x20, + XREMOTE = XID_TYPE_XREMOTE << 8 | 0x00, + STEEL_BATTALION = XID_TYPE_STEELBATTALION << 8 | 0x01, +} xid_type; + +void usbh_xid_init(void); +void usbh_install_xid_conn_callback(XID_CONN_FUNC *conn_func, XID_CONN_FUNC *disconn_func); +xid_dev_t *usbh_xid_get_device_list(void); +int32_t usbh_xid_read(xid_dev_t *xid_dev, uint8_t ep_addr, void *rx_complete_callback); +int32_t usbh_xid_write(xid_dev_t *xid_dev, uint8_t ep_addr, uint8_t *txbuff, uint32_t len, void *tx_complete_callback); +xid_type usbh_xid_get_type(xid_dev_t *xid_dev); +int32_t usbh_xid_rumble(xid_dev_t *xid_dev, uint16_t l_value, uint16_t h_value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/usb/misc/malloc.c b/lib/usb/misc/malloc.c deleted file mode 100644 index 5d8f356ed..000000000 --- a/lib/usb/misc/malloc.c +++ /dev/null @@ -1,35 +0,0 @@ -//#include "sys/types.h" -//#include "sys/nttypes.h" -//#include "sys/xboxkrnl.h" -//#include "stdlib.h" - -#include -// #include -// #include -#include - -/* a retail Xbox has 64 MB of RAM */ -#define RAMSIZE (64 * 1024*1024) -#define RAMSIZE_USE (RAMSIZE - 4096*1024) -/* position of protected mode kernel */ -#define PM_KERNEL_DEST 0x100000 -/* Lowest allowable address of the kernel (at or above 1 meg) */ -#define MIN_KERNEL PM_KERNEL_DEST -/* Highest allowable address */ -#define MAX_KERNEL (RAMSIZE_USE-1) - - -void *malloc2(size_t s) -{ - PVOID *virt_addr; - - //virt_addr = MmAllocateContiguousMemory(s); - - virt_addr = MmAllocateContiguousMemoryEx(s, MIN_KERNEL, MAX_KERNEL, 0, PAGE_READWRITE); - return virt_addr; -} - -void free2(void *x) -{ - MmFreeContiguousMemory(x); -} diff --git a/lib/usb/misc/misc.c b/lib/usb/misc/misc.c deleted file mode 100644 index 3c3385043..000000000 --- a/lib/usb/misc/misc.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include "usb/include/cromwell_types.h" - -void wait_ms(DWORD ticks); - -/*------------------------------------------------------------------------*/ -void my_wait_ms(int x) -{ - wait_ms(x); -} -/*------------------------------------------------------------------------*/ -void my_mdelay(int x) -{ - wait_ms(x); -} -/*------------------------------------------------------------------------*/ -void my_udelay(int x) -{ - wait_ms(1+x/1000); -} - -void wait_ms(DWORD ticks) { - - /* - 32 Bit range = 1200 sec ! => 20 min - 1. sec = 0x369E99 - 1 ms = 3579,545 - - */ - - DWORD COUNT_start; - DWORD temp; - DWORD COUNT_TO; - DWORD HH; - - // Maximum Input range - if (ticks>(1200*1000)) ticks = 1200*1000; - - COUNT_TO = (DWORD) ((float)(ticks*3579.545)); - COUNT_start = IoInputDword(0x8008); - - while(1) { - - // Reads out the System timer - HH = IoInputDword(0x8008); - temp = HH-COUNT_start; - // We reached the counter - if (temp>COUNT_TO) break; - - }; - - -} diff --git a/lib/usb/misc/pci.c b/lib/usb/misc/pci.c deleted file mode 100644 index dd0ed25d9..000000000 --- a/lib/usb/misc/pci.c +++ /dev/null @@ -1,462 +0,0 @@ -//#include "boot.h" -#include -#include "usb/include/cromwell_types.h" -// #include -#include -// by ozpaulb@hotmail.com 2002-07-14 - -#define BUS_0 0 -#define BUS_1 1 - -#define DEV_0 0 -#define DEV_1 1 -#define DEV_2 2 -#define DEV_3 3 -#define DEV_4 4 -#define DEV_5 5 -#define DEV_6 6 -#define DEV_7 7 -#define DEV_8 8 -#define DEV_9 9 -#define DEV_a 0xa -#define DEV_b 0xb -#define DEV_c 0xc -#define DEV_d 0xd -#define DEV_e 0xe -#define DEV_f 0xf -#define DEV_10 0x10 -#define DEV_11 0x11 -#define DEV_12 0x12 -#define DEV_13 0x13 -#define DEV_14 0x14 -#define DEV_15 0x15 -#define DEV_16 0x16 -#define DEV_17 0x17 -#define DEV_18 0x18 -#define DEV_19 0x19 -#define DEV_1a 0x1a -#define DEV_1b 0x1b -#define DEV_1c 0x1c -#define DEV_1d 0x1d -#define DEV_1e 0x1e -#define DEV_1f 0x1f - -#define FUNC_0 0 - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -u8 PciReadByte(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off) -{ - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - - IoOutputDword(0xcf8, (base_addr + (reg_off & 0xfc))); - return IoInputByte(0xcfc + (reg_off & 3)); -} - -void PciWriteByte (unsigned int bus, unsigned int dev, unsigned int func, - unsigned int reg_off, unsigned char byteval) -{ - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - - IoOutputDword(0xcf8, (base_addr + (reg_off & 0xfc))); - IoOutputByte(0xcfc + (reg_off & 3), byteval); -} - - -u16 PciReadWord(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off) -{ - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - - IoOutputDword(0xcf8, (base_addr + (reg_off & 0xfe))); - return IoInputWord(0xcfc + (reg_off & 1)); -} - - -void PciWriteWord(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, u16 w) -{ - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - - IoOutputDword(0xcf8, (base_addr + (reg_off & 0xfc))); - IoOutputWord(0xcfc + (reg_off & 1), w); -} - - -u32 PciReadDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off) -{ - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - base_addr |= ((func & 0x07) << 8); - base_addr |= ((reg_off & 0xff)); - - IoOutputDword(0xcf8, base_addr); - return IoInputDword(0xcfc); -} - - -u32 PciWriteDword(unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg_off, unsigned int dw) -{ - - u32 base_addr = 0x80000000; - base_addr |= ((bus & 0xFF) << 16); // bus # - base_addr |= ((dev & 0x1F) << 11); // device # - base_addr |= ((func & 0x07) << 8); // func # - base_addr |= ((reg_off & 0xff)); - - IoOutputDword(0xcf8, base_addr ); - IoOutputDword(0xcfc ,dw); - - return 0; -} -#define RTC_REG_A 10 -#define RTC_REG_B 11 -#define RTC_REG_C 12 -#define RTC_REG_D 13 -#define RTC_FREQ_SELECT RTC_REG_A -#define RTC_CONTROL RTC_REG_B -#define RTC_INTR_FLAGS RTC_REG_C - -/* On PCs, the checksum is built only over bytes 16..45 */ -#define PC_CKS_RANGE_START 16 -#define PC_CKS_RANGE_END 45 -#define PC_CKS_LOC 46 - -#define RTC_RATE_1024HZ 0x06 -#define RTC_REF_CLCK_32KHZ 0x20 -#define RTC_FREQ_SELECT_DEFAULT (RTC_REF_CLCK_32KHZ | RTC_RATE_1024HZ) -#define RTC_24H 0x02 -#define RTC_CONTROL_DEFAULT (RTC_24H) - - -//// access to RTC CMOS memory -//u8 CMOS_READ(u8 addr) { -// IoOutputByte(0x70,addr); -// return IoInputByte(0x71); -//} -// -//void CMOS_WRITE(u8 val, u8 addr) { -// IoOutputByte(0x70,addr); -// IoOutputByte(0x71,val); -//} -// -//void BiosCmosWrite(u8 bAds, u8 bData) { -// IoOutputByte(0x70, bAds); -// IoOutputByte(0x71, bData); -// -// IoOutputByte(0x72, bAds); -// IoOutputByte(0x73, bData); -//} -// -//u8 BiosCmosRead(u8 bAds) -//{ -// IoOutputByte(0x72, bAds); -// return IoInputByte(0x73); -//} -// -//int rtc_checksum_valid(int range_start, int range_end, int cks_loc) -//{ -// int i; -// unsigned sum, old_sum; -// sum = 0; -// for(i = range_start; i <= range_end; i++) { -// sum += CMOS_READ(i); -// } -// sum = (~sum)&0x0ffff; -// old_sum = ((CMOS_READ(cks_loc)<<8) | CMOS_READ(cks_loc+1))&0x0ffff; -// return sum == old_sum; -//} -// -//void rtc_set_checksum(int range_start, int range_end, int cks_loc) -//{ -// int i; -// unsigned sum; -// sum = 0; -// for(i = range_start; i <= range_end; i++) { -// sum += CMOS_READ(i); -// } -// sum = ~(sum & 0x0ffff); -// CMOS_WRITE(((sum >> 8) & 0x0ff), cks_loc); -// CMOS_WRITE(((sum >> 0) & 0x0ff), cks_loc+1); -//} -// -//void BootAGPBUSInitialization(void) -//{ -// u32 temp; -// PciWriteDword(BUS_0, DEV_1, FUNC_0, 0x54, PciReadDword(BUS_0, DEV_1, FUNC_0, 0x54) | 0x88000000 ); -// -// PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x64, (PciReadDword(BUS_0, DEV_0, FUNC_0, 0x64))| 0x88000000 ); -// -// temp = PciReadDword(BUS_0, DEV_0, FUNC_0, 0x6C); -// IoOutputDword(0xcfc , temp & 0xFFFFFFFE); -// IoOutputDword(0xcfc , temp ); -// -// PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x80, 0x00000100); -// -//} -// -//void BootDetectMemorySize(void) -//{ -// int i; -// int result; -// unsigned char *fillstring; -// void *membasetop = (void*)((64*1024*1024)); -// void *membaselow = (void*)((0)); -// -// (*(unsigned int*)(0xFD000000 + 0x100200)) = 0x03070103 ; -// (*(unsigned int*)(0xFD000000 + 0x100204)) = 0x11448000 ; -// -// PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x84, 0x7FFFFFF); // 128 MB -// -// xbox_ram = 64; -// fillstring = malloc(0x200); -// memset(fillstring,0xAA,0x200); -// memset(membasetop,0xAA,0x200); -// asm volatile ("wbinvd\n"); -// -// if (!memcmp(membasetop,fillstring,0x200)) { -// // Looks like there is memory .. maybe a 128MB box -// memset(fillstring,0x55,0x200); -// memset(membasetop,0x55,0x200); -// asm volatile ("wbinvd\n"); -// if (!memcmp(membasetop,fillstring,0x200)) { -// // Looks like there is memory -// // now we are sure, we set memory -// if (memcmp(membaselow,fillstring,0x200) == 0) { -// // Hell, we find the Test-string at 0x0 too ! -// xbox_ram = 64; -// } else { -// xbox_ram = 128; -// } -// } -// -// } -// if (xbox_ram == 64) { -// PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x84, 0x3FFFFFF); // 64 MB -// } -// else if (xbox_ram == 128) { -// PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x84, 0x7FFFFFF); // 128 MB -// } -// free(fillstring); -//} - -void BootPciPeripheralInitialization() -{ - __asm__ __volatile__ ( "cli" ); - - //// This will disable OHCI Memory Access - // int command = PciReadDword(BUS_0, 2, FUNC_0, 0); - // command = command & (~2) ; - // PciWriteDword(BUS_0, 2, FUNC_0, 0,command); - // - ////memset((void*)0x0,0x0,100); - //memset((void*)0xfed00006,0x0,40); - //memset((void*)0xfed08006,0x0,40); - - - //PciWriteDword(BUS_0, DEV_1, 0, 0x80, 2); // v1.1 2BL kill ROM area - //if(PciReadByte(BUS_0, DEV_1, 0, 0x8)>=0xd1) { // check revision - // PciWriteDword(BUS_0, DEV_1, 0, 0xc8, 0x8f00); // v1.1 2BL <-- death - //} - - //// Bus 0, Device 0, Function 0 = PCI Bridge Device - Host Bridge - //PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x48, 0x00000114); - //PciWriteDword(BUS_0, DEV_0, FUNC_0, 0x44, 0x80000000); // new 2003-01-23 ag trying to get single write actions on TSOP - //PciWriteByte(BUS_0, DEV_0, FUNC_0, 0x87, 3); // kern 8001FC21 - //PciWriteByte(BUS_0, DEV_0, 8, 0, 0x42); // Xbeboot-compare - // - //IoOutputByte(0x2e, 0x55); - //IoOutputByte(0x2e, 0x26); - //IoOutputByte(0x61, 0xff); - //IoOutputByte(0x92, 0x01); - //IoOutputByte(0xcf9, 0x0); // Reset Port - // IoOutputByte(0x43, 0x36); // Timer 0 (system time): mode 3 - // IoOutputByte(0x40, 0xFF); // 18.2Hz (1.19318MHz/65535) - // IoOutputByte(0x40, 0xFF); - // IoOutputByte(0x43, 0x54); // Timer 1 (ISA refresh): mode 2 - // IoOutputByte(0x41, 18); // 64KHz (1.19318MHz/18) - // IoOutputByte(0x00, 0); // clear base address 0 - // IoOutputByte(0x00, 0); - // IoOutputByte(0x01, 0); // clear count 0 - // IoOutputByte(0x01, 0); - // IoOutputByte(0x02, 0); // clear base address 1 - // IoOutputByte(0x02, 0 ); - // IoOutputByte(0x03, 0); // clear count 1 - // IoOutputByte(0x03, 0); - // IoOutputByte(0x04, 0); // clear base address 2 - // IoOutputByte(0x04, 0); - // IoOutputByte(0x05, 0); // clear count 2 - // IoOutputByte(0x05, 0); - // IoOutputByte(0x06, 0); // clear base address 3 - // IoOutputByte(0x06, 0); - // IoOutputByte(0x07, 0); // clear count 3 - // IoOutputByte(0x07, 0); - // IoOutputByte(0x0B, 0x40); // set channel 0 to single mode, verify transfer - // IoOutputByte(0x0B, 0x41); // set channel 1 to single mode, verify transfer - // IoOutputByte(0x0B, 0x42); // set channel 2 to single mode, verify transfer - // IoOutputByte(0x0B, 0x43); // set channel 3 to single mode, verify transfer - // IoOutputByte(0x08, 0); // enable controller - // IoOutputByte(0xC0, 0); // clear base address 0 - // IoOutputByte(0xC0, 0); - // IoOutputByte(0xC2, 0); // clear count 0 - // IoOutputByte(0xC2, 0); - // IoOutputByte(0xC4, 0); // clear base address 1 - // IoOutputByte(0xC4, 0); - // IoOutputByte(0xC6, 0); // clear count 1 - // IoOutputByte(0xC6, 0); - // IoOutputByte(0xC8, 0); // clear base address 2 - // IoOutputByte(0xC8, 0); - // IoOutputByte(0xCA, 0); // clear count 2 - // IoOutputByte(0xCA, 0); - // IoOutputByte(0xCC, 0); // clear base address 3 - // IoOutputByte(0xCC, 0); - // IoOutputByte(0xCE, 0); // clear count 3 - // IoOutputByte(0xCE, 0); - // IoOutputByte(0xD6, 0xC0); // set channel 0 to cascade mode - // IoOutputByte(0xD6, 0xC1); // set channel 1 to single mode, verify transfer - // IoOutputByte(0xD6, 0xC2); // set channel 2 to single mode, verify transfer - // IoOutputByte(0xD6, 0xC3); // set channel 3 to single mode, verify transfer - // IoOutputByte(0xD0, 0); // enable controller - // IoOutputByte(0x0E, 0); // enable DMA0 channels - // IoOutputByte(0xD4, 0); // clear chain 4 mask - - ///* Setup the real time clock */ - //CMOS_WRITE(RTC_CONTROL_DEFAULT, RTC_CONTROL); - // - ///* Setup the frequency it operates at */ - //CMOS_WRITE(RTC_FREQ_SELECT_DEFAULT, RTC_FREQ_SELECT); - // - ///* Make certain we have a valid checksum */ - ////rtc_set_checksum(PC_CKS_RANGE_START, - // //PC_CKS_RANGE_END,PC_CKS_LOC); - ///* Clear any pending interrupts */ - //(void) CMOS_READ(RTC_INTR_FLAGS); - - // configure ACPI hardware to generate interrupt on PIC-chip pin6 action (via EXTSMI#) - IoOutputByte(0x80ce, 0x08); // from 2bl RI# - IoOutputByte(0x80c0, 0x08); // from 2bl SMBUSC - IoOutputByte(0x8004, IoInputByte(0x8004)|1); // KERN: SCI enable == SCI interrupt generated - IoOutputWord(0x8022, IoInputByte(0x8022)|2); // KERN: Interrupt enable register, b1 RESERVED in AMD docs - IoOutputWord(0x8023, IoInputByte(0x8023)|2); // KERN: Interrupt enable register, b1 RESERVED in AMD docs - IoOutputByte(0x8002, IoInputByte(0x8002)|1); // KERN: Enable SCI interrupt when timer status goes high - IoOutputWord(0x8028, IoInputByte(0x8028)|1); // KERN: setting readonly trap event??? - -// I2CTransmitWord(0x10, 0x0b00); // Allow audio -// //I2CTransmitWord(0x10, 0x0b01); // GAH!!! Audio Mute! - - //// Bus 0, Device 1, Function 0 = nForce HUB Interface - ISA Bridge - //PciWriteDword(BUS_0, DEV_1, FUNC_0, 0x6c, 0x0e065491); - //PciWriteByte(BUS_0, DEV_1, FUNC_0, 0x6a, 0x0003); // kern ??? gets us an int3? vsync req - //PciWriteDword(BUS_0, DEV_1, FUNC_0, 0x64, 0x00000b0c); - //PciWriteByte(BUS_0, DEV_1, FUNC_0, 0x81, PciReadByte(BUS_0, DEV_1, FUNC_0, 0x81)|8); - //PciWriteDword(BUS_0, DEV_1, FUNC_0, 0x4c, 0x000f0000); // RTC clocks enable? 2Hz INT8? - - - //// Bus 0, Device 9, Function 0 = nForce ATA Controller - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x20, 0x0000ff61); // (BMIBA) Set Busmaster regs I/O base address 0xff60 - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 4, PciReadDword(BUS_0, DEV_9, FUNC_0, 4)|5); // 0x00b00005 ); - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 8, PciReadDword(BUS_0, DEV_9, FUNC_0, 8)&0xfffffeff); // 0x01018ab1 ); // was fffffaff - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x58, 0x20202020); // kern1.1 - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x60, 0x00000000); // kern1.1 - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x50, 0x00000002); // without this there is no register footprint at IO 1F0 - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x2c, 0x00000000); // frankenregister from xbe boot - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x40, 0x00000000); // frankenregister from xbe boot - // - //// below reinstated by frankenregister compare with xbe boot - //PciWriteDword(BUS_0, DEV_9, FUNC_0, 0x60, 0xC0C0C0C0); // kern1.1 <--- this was in kern1.1 but is FATAL for good HDD access - - //// Bus 0, Device 4, Function 0 = nForce MCP Networking Adapter - all verified with kern1.1 - //PciWriteDword(BUS_0, DEV_4, FUNC_0, 4, PciReadDword(BUS_0, DEV_4, FUNC_0, 4) | 7 ); - //PciWriteDword(BUS_0, DEV_4, FUNC_0, 0x10, 0xfef00000); // memory base address 0xfef00000 - //PciWriteDword(BUS_0, DEV_4, FUNC_0, 0x14, 0x0000e001); // I/O base address 0xe000 - //PciWriteDword(BUS_0, DEV_4, FUNC_0, 0x118-0xdc, (PciReadDword(BUS_0, DEV_4, FUNC_0, 0x3c) &0xffff0000) | 0x0004 ); - - - // Bus 0, Device 2, Function 0 = nForce OHCI USB Controller - all verified with kern 1.1 - PciWriteDword(BUS_0, DEV_2, FUNC_0, 4, PciReadDword(BUS_0, DEV_2, FUNC_0, 4) | 7 ); - PciWriteDword(BUS_0, DEV_2, FUNC_0, 0x10, 0xfed00000); // memory base address 0xfed00000 - PciWriteDword(BUS_0, DEV_2, FUNC_0, 0x3c, (PciReadDword(BUS_0, DEV_2, FUNC_0, 0x3c) &0xffff0000) | 0x0001 ); - PciWriteDword(BUS_0, DEV_2, FUNC_0, 0x50, 0x0000000f); - - // Bus 0, Device 3, Function 0 = nForce OHCI USB Controller - verified with kern1.1 - PciWriteDword(BUS_0, DEV_3, FUNC_0, 4, PciReadDword(BUS_0, DEV_3, FUNC_0, 4) | 7 ); - PciWriteDword(BUS_0, DEV_3, FUNC_0, 0x10, 0xfed08000); // memory base address 0xfed08000 - PciWriteDword(BUS_0, DEV_3, FUNC_0, 0x3c, (PciReadDword(BUS_0, DEV_3, FUNC_0, 0x3c) &0xffff0000) | 0x0009 ); - PciWriteDword(BUS_0, DEV_3, FUNC_0, 0x50, 0x00000030); // actually u8? - - //// Bus 0, Device 6, Function 0 = nForce Audio Codec Interface - verified with kern1.1 - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 4, PciReadDword(BUS_0, DEV_6, FUNC_0, 4) | 7 ); - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x10, (PciReadDword(BUS_0, DEV_6, FUNC_0, 0x10) &0xffff0000) | 0xd001 ); // MIXER at IO 0xd000 - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x14, (PciReadDword(BUS_0, DEV_6, FUNC_0, 0x14) &0xffff0000) | 0xd201 ); // BusMaster at IO 0xD200 - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x18, 0xfec00000); // memory base address 0xfec00000 - - //// frankenregister from working Linux driver - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 8, 0x40100b1 ); - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0xc, 0x800000 ); - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x3c, 0x05020106 ); - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x44, 0x20001 ); - //PciWriteDword(BUS_0, DEV_6, FUNC_0, 0x4c, 0x107 ); - - //// Bus 0, Device 5, Function 0 = nForce MCP APU - //PciWriteDword(BUS_0, DEV_5, FUNC_0, 4, PciReadDword(BUS_0, DEV_5, FUNC_0, 4) | 7 ); - //PciWriteDword(BUS_0, DEV_5, FUNC_0, 0x3c, (PciReadDword(BUS_0, DEV_5, FUNC_0, 0x3c) &0xffff0000) | 0x0005 ); - //PciWriteDword(BUS_0, DEV_5, FUNC_0, 0x10, 0xfe800000); // memory base address 0xfe800000 - - //// Bus 0, Device 1, Function 0 = nForce HUB Interface - ISA Bridge - //PciWriteDword(BUS_0, DEV_1, FUNC_0, 0x8c, (PciReadDword(BUS_0, DEV_1, FUNC_0, 0x8c) &0xfbffffff) | 0x08000000 ); - - // ACPI pin init - IoOutputDword(0x80b4, 0xffff); // any interrupt resets ACPI system inactivity timer - IoOutputByte(0x80cc, 0x08); // Set EXTSMI# pin to be pin function - IoOutputByte(0x80cd, 0x08); // Set PRDY pin on ACPI to be PRDY function - IoOutputByte(0x80cf, 0x08); // Set C32KHZ pin to be pin function - IoOutputWord(0x8020, IoInputWord(0x8020)|0x200); // ack any preceding ACPI int - // - //// Bus 0, Device 1e, Function 0 = nForce AGP Host to PCI Bridge - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 4, PciReadDword(BUS_0, DEV_1e, FUNC_0, 4) | 7 ); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x18, (PciReadDword(BUS_0, DEV_1e, FUNC_0, 0x18) &0xffffff00)); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x3c, 7); // trying to get video irq - - //// frankenregister xbe load correction to match cromwell load - //// controls requests for memory regions - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x0c, 0xff019ee7); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x10, 0xbcfaf7e7); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x14, 0x0101fafa); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x1c, 0x02a000f0); // Coud this be the BASE Video Address ? - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x20, 0xfdf0fd00); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x24, 0xf7f0f000); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x28, 0x8e7ffcff); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x2c, 0xf8bfef87); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x30, 0xdf758fa3); - //PciWriteDword(BUS_0, DEV_1e, FUNC_0, 0x38, 0xb785fccc); - - //// Bus 1, Device 0, Function 0 = NV2A GeForce3 Integrated GPU - //PciWriteDword(BUS_1, DEV_0, FUNC_0, 4, PciReadDword(BUS_1, DEV_0, FUNC_0, 4) | 7 ); - //PciWriteDword(BUS_1, DEV_0, FUNC_0, 0x3c, (PciReadDword(BUS_1, DEV_0, FUNC_0, 0x3c) &0xffff0000) | 0x0103 ); // should get vid irq!! - //PciWriteDword(BUS_1, DEV_0, FUNC_0, 0x4c, 0x00000114); - - //// frankenregisters so Xromwell matches Cromwell - //PciWriteDword(BUS_1, DEV_0, FUNC_0, 0x0c, 0x0); - //PciWriteDword(BUS_1, DEV_0, FUNC_0, 0x18, 0x08); - - __asm__ __volatile__ ( "sti" ); -} diff --git a/lib/usb/ohci.h b/lib/usb/ohci.h deleted file mode 100644 index ef43a0490..000000000 --- a/lib/usb/ohci.h +++ /dev/null @@ -1,247 +0,0 @@ -/******************************************************************************/ -/* */ -/* File: ohci.h */ -/* */ -/* Details: Original File & Design: Thomas Frei */ -/* (modifications for xbox openxdk by bkenwright) */ -/* (bkenwright@xbdev.net) www.xbdev.net */ -/* */ -/******************************************************************************/ - - -#ifndef __OHCI_X__ -#define __OHCI_X__ - -#include - -typedef unsigned char __u8; -typedef char __s8; -typedef unsigned short __u16; -typedef short __s16; -typedef unsigned long __u32; -typedef int __s32; - - -// Example sippet of possible later improvment on structure aligment in vs -// __declspec(align(32)) struct Str1 -// { -// int a, b, c, d, e; -// }; - -/* -typedef unsigned char __u8; -typedef char __s8; -typedef unsigned short __u16; -typedef short __s16; -typedef unsigned long __u32; -typedef int __s32; - -#define NULL 0 -*/ - - - -#define SIZEOF_HCCA 0x100 - - - -/* - * The HCCA (Host Controller Communications Area) is a 256 byte - * structure defined in the OHCI spec. that the host controller is - * told the base address of. It must be 256-byte aligned. - */ - -#define NUM_INTS 32 /* part of the OHCI standard */ - - - -#pragma pack( push, 1 ) -struct ohci_hcca -{ - __u32 int_table[NUM_INTS]; /* Interrupt ED table */ - __u16 frame_no; /* current frame number */ - __u16 pad1; /* set to 0 on each frame_no change */ - __u32 done_head; /* info returned for an interrupt */ - __u8 reserved_for_hc[116]; -}; -#pragma pack( pop ) -typedef struct ohci_hcca ohci_hcca_t; - - -/* - * Maximum number of root hub ports. - */ - -#define MAX_ROOT_PORTS 15 - - -#pragma pack(1) -typedef volatile struct -{ - /* control and status registers */ - __u32 revision; - __u32 control; - __u32 cmdstatus; - __u32 intrstatus; - __u32 intrenable; - __u32 intrdisable; - /* memory pointers */ - __u32 hcca; - __u32 ed_periodcurrent; - __u32 ed_controlhead; - __u32 ed_controlcurrent; - __u32 ed_bulkhead; - __u32 ed_bulkcurrent; - __u32 donehead; - /* frame counters */ - __u32 fminterval; - __u32 fmremaining; - __u32 fmnumber; - __u32 periodicstart; - __u32 lsthresh; - /* Root hub ports */ - volatile struct ohci_roothub_regs - { - __u32 a; - __u32 b; - __u32 status; - __u32 portstatus[MAX_ROOT_PORTS]; - } roothub; -} ohci_regs_t; -#pragma pack() - - - - -#pragma pack(1) -typedef struct ohci -{ - volatile ohci_hcca_t *hcca; /* hcca */ - - volatile ohci_regs_t * regs; /* OHCI controller's memory */ - -} ohci_t; -#pragma pack() - - -/******************************************************************************/ - - -#define SKIP 0x4000L -#define OUTV 0x0800L -#define INV 0x1000L -#define AUTOIO 0x1800L -#define LOWS 0x2000L - - - -//#pragma block (push,1) -#pragma pack(1) -typedef struct { -__u32 Format; -__u32 Tailptr; -__u32 Headptr; -__u32 NextED; -} s_Endpointdescripor; -#pragma pack() - -#pragma pack(1) -typedef struct { -__u32 Format; -__u32 Buffer; -__u32 NextTD; -__u32 BufferEnd; -} s_Transferdescriptor; -#pragma pack() - -#pragma pack(1) -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u16 USB; -__u8 DeviceClass; -__u8 DeviceSubClass; -__u8 DeviceProtocol; -__u8 MaxPacketSize; -__u16 Vendor; -__u16 ProductID; -__u16 Device; -__u8 Manufacturer; -__u8 ProductIndex; -__u8 SerialNumber; -__u8 ConfigNumber; -} s_USB_Devicedescriptor; -#pragma pack() - -#pragma pack(1) -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u16 TotalLength; -__u8 NumberofInterfaces; -__u8 ConfigValue; -__u8 Configuration; -__u8 Attributes; -__u8 MaxPower; -} s_USB_Configurationdescriptor; - -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u8 Interfacenumber; -__u8 AlternateSetting; -__u8 NumberofEndpoints; -__u8 InterfaceClass; -__u8 InterfaceSubClass; -__u8 InterfaceProtocol; -__u8 InterfaceIndex; -} s_USB_Interfacedescriptor; - -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u8 EndpointAddress; -__u8 Attributes; -__u16 MaxPacketSize; -__u8 Interval; -} s_USB_Endpointdescriptor; - -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u16 *LANGID; -} s_USB_Languagedescriptor; - -typedef struct { -__u8 Length; -__u8 DescriptorType; -__u8 *String; -} s_USB_Stringdescriptor; -//#pragma block (pop) -#pragma pack() - - -/******************************************************************************/ - -// Main Functions -int FindOHC(ohci_t * ohci, void *regbase); -int FindDev(ohci_t * ohci, int Port); - - -int ResetPort(ohci_t * ohci, int Port); -int SetAddres(ohci_t * ohci, int Port, __u8 AddrNew); -int SetConfigur(ohci_t * ohci, __u8 Addr, __u8 Config); -int GetDesc(ohci_t * ohci, __u8 Addr, __u8 DescrType, __u8 Index, __u8 Count, __u8 *DBuffer); - - - -// Debug Functions -void DebugFile(ohci_t * ohci); -void DebugDescriptor( s_USB_Devicedescriptor * pDes ); -void DebugConfigDescriptor( s_USB_Configurationdescriptor * pDes ); -void DebugInterfaceDescriptor( s_USB_Interfacedescriptor * pDes ); -void DebugEndPointDescriptor( s_USB_Endpointdescriptor * pDes ); - - - -#endif // __OHCI_X__ diff --git a/lib/usb/sys/BootUSB.c b/lib/usb/sys/BootUSB.c deleted file mode 100644 index f903c0d82..000000000 --- a/lib/usb/sys/BootUSB.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * USB support for XBOX, based on Linux kernel source - * - * 2003-06-21 Georg Acher (georg@acher.org) - * -*/ - -#include "../usb_wrapper.h" - -void subsys_usb_init(void); -void module_exit_usb_exit(void); - -extern struct pci_device_id *module_table_pci_ids; - -// straigth call... -int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id); -void usb_hcd_pci_remove (struct pci_dev *dev); - -void XPADInit(void); -void XPADRemove(void); -void XRemoteInit(void); -void XRemoteRemove(void); -void UsbKeyBoardInit(void); -void UsbKeyBoardRemove(void); -void UsbMouseInit(void); -void UsbMouseRemove(void); - -void USBGetEvents(void); - -extern int (*thread_handler)(void*); -int (*hub_thread_handler)(void*); - -extern int nousb; -extern int xpad_num; - -struct pci_dev xx_ohci_dev={ - .vendor = 0, - .device = 0, - .bus = NULL, - .irq = 1, // currently not used... - .slot_name = "OHCI", - .dev = {.name = "PCI",.dma_mask=1}, - .base = {0xfed00000}, - .flags = {} -}; - -/*------------------------------------------------------------------------*/ -void BootStartUSB(void) -{ - int n; - - nousb=0; - - init_wrapper(); - subsys_usb_init(); - hub_thread_handler=thread_handler; - usb_hcd_pci_probe(&xx_ohci_dev, module_table_pci_ids); - - XPADInit(); - XRemoteInit(); - UsbKeyBoardInit(); - UsbMouseInit(); - - for(n=0;n<200;n++) { - USBGetEvents(); - wait_ms(1); - } -} -/*------------------------------------------------------------------------*/ -void USBGetEvents(void) -{ - inc_jiffies(1); - do_all_timers(); - hub_thread_handler(NULL); - handle_irqs(-1); -} -/*------------------------------------------------------------------------*/ -void BootStopUSB(void) -{ - int n; - - XPADRemove(); - XRemoteRemove(); - UsbKeyBoardRemove(); - UsbMouseRemove(); - - for(n=0;n<100;n++) - { - USBGetEvents(); - wait_ms(1); - } - - module_exit_usb_exit(); - usb_hcd_pci_remove(&xx_ohci_dev); - -} -/*------------------------------------------------------------------------*/ diff --git a/lib/usb/sys/keyboardcodes.h b/lib/usb/sys/keyboardcodes.h deleted file mode 100644 index 87cf48858..000000000 --- a/lib/usb/sys/keyboardcodes.h +++ /dev/null @@ -1,784 +0,0 @@ -#ifndef _KEYBOARD_CODES -#define _KEYBOARD_CODES - -static unsigned char ucUSBtoKey[256] = -{ -XKEY_INVALID, -XKEY_INVALID, -XKEY_INVALID, -XKEY_INVALID, -XKEY_A, -XKEY_B, -XKEY_C, -XKEY_D, -XKEY_E, -XKEY_F, -XKEY_G, -XKEY_H, -XKEY_I, -XKEY_J, -XKEY_K, -XKEY_L, -XKEY_M, -XKEY_N, -XKEY_O, -XKEY_P, -XKEY_Q, -XKEY_R, -XKEY_S, -XKEY_T, -XKEY_U, -XKEY_V, -XKEY_W, -XKEY_X, -XKEY_Y, -XKEY_Z, -XKEY_1, -XKEY_2, -XKEY_3, -XKEY_4, -XKEY_5, -XKEY_6, -XKEY_7, -XKEY_8, -XKEY_9, -XKEY_0, -XKEY_RETURN, -XKEY_ESCAPE, -XKEY_BACKSPACE, -XKEY_TAB, -XKEY_SPACE, -XKEY_MINUS, -XKEY_EQUALS, -XKEY_LBRACE, -XKEY_RBRACE, -XKEY_BACKSLASH, -XKEY_GRAVE, -XKEY_SEMICOLON, -XKEY_QUOTE, -XKEY_GRAVE, -XKEY_COMMA, -XKEY_PERIOD, -XKEY_SLASH, -XKEY_CAPSLOCK, -XKEY_F1, -XKEY_F2, -XKEY_F3, -XKEY_F4, -XKEY_F5, -XKEY_F6, -XKEY_F7, -XKEY_F8, -XKEY_F9, -XKEY_F10, -XKEY_F11, -XKEY_F12, -XKEY_PRINTSCREEN, -XKEY_SCROLL_LOCK, -XKEY_PAUSE, -XKEY_INSERT, -XKEY_HOME, -XKEY_PRIOR, -XKEY_DELETE, -XKEY_END, -XKEY_NEXT, -XKEY_RIGHT, -XKEY_LEFT, -XKEY_DOWN, -XKEY_UP, -XKEY_NUMLOCK, -XKEY_DIVIDE, -XKEY_MULTIPLY, -XKEY_SUBTRACT, -XKEY_ADD, -XKEY_NUMPAD_ENTER, -XKEY_NUMPAD1, -XKEY_NUMPAD2, -XKEY_NUMPAD3, -XKEY_NUMPAD4, -XKEY_NUMPAD5, -XKEY_NUMPAD6, -XKEY_NUMPAD7, -XKEY_NUMPAD8, -XKEY_NUMPAD9, -XKEY_NUMPAD0, -XKEY_DECIMAL, -XKEY_BACKSLASH, -XKEY_APPS, -XKEY_SLEEP, -XKEY_NUMPADEQUALS, -XKEY_F13, -XKEY_F14, -XKEY_F15, -XKEY_F16, -XKEY_F17, -XKEY_F18, -XKEY_F19, -XKEY_F20, -XKEY_F21, -XKEY_F22, -XKEY_F23, -XKEY_F24, -XKEY_EXECUTE, -XKEY_HELP, -XKEY_MENU, -XKEY_SELECT, -XKEY_BROWSER_STOP, -XKEY_INVALID, // Keyboard Again -XKEY_INVALID, // Keyboard Undo -XKEY_INVALID, // Keyboard Cut -XKEY_INVALID, // Keyboard Copy -XKEY_INVALID, // Keyboard Paste -XKEY_BROWSER_SEARCH, -XKEY_VOLUME_MUTE, -XKEY_VOLUME_UP, -XKEY_VOLUME_DOWN, -XKEY_INVALID, // Keyboard locking caps lock -XKEY_INVALID, // Keyboard locking num lock -XKEY_INVALID, // Keyboard locking scroll lock -XKEY_DECIMAL, -XKEY_NUMPADEQUALS, -XKEY_INVALID, // Keyboard International 1 -XKEY_INVALID, // Keyboard International 2 -XKEY_INVALID, // Keyboard International 3 -XKEY_INVALID, // Keyboard International 4 -XKEY_INVALID, // Keyboard International 5 -XKEY_INVALID, // Keyboard International 6 -XKEY_INVALID, // Keyboard International 7 -XKEY_INVALID, // Keyboard International 8 -XKEY_INVALID, // Keyboard International 9 -XKEY_INVALID, // Keyboard Lang 1 -XKEY_KANJI, -XKEY_KANA, -XKEY_INVALID, // Keyboard Lang 4 -XKEY_INVALID, // Keyboard Lang 5 -XKEY_INVALID, // Keyboard Lang 6 -XKEY_INVALID, // Keyboard Lang 7 -XKEY_INVALID, // Keyboard Lang 8 -XKEY_INVALID, // Keyboard Lang 9 -XKEY_INVALID, // Keyboard Alternate Erase -XKEY_INVALID, // Keyboard SysReq/Attention -XKEY_INVALID, // Keyboard Cancel -XKEY_INVALID, // Keyboard Clear -XKEY_INVALID, // Keyboard Prior -XKEY_INVALID, // Keyboard Return -XKEY_INVALID, // Keyboard Separator -XKEY_INVALID, // Keyboard Out -XKEY_INVALID, // Keyboard Oper -XKEY_INVALID, // Keyboard Clear/Again -XKEY_INVALID, // Keyboard CrSel/Props -XKEY_INVALID, // Keyboard ExSel -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Keypad 00 -XKEY_INVALID, // Keypad 000 -XKEY_INVALID, // Thousands Separator -XKEY_INVALID, // Decimal Separator -XKEY_INVALID, // Currency Unit -XKEY_INVALID, // Currency Sub-unit -XKEY_INVALID, // Keypad ( -XKEY_INVALID, // Keypad ) -XKEY_INVALID, // Keypad { -XKEY_INVALID, // Keypad } -XKEY_INVALID, // Keypad Tab -XKEY_INVALID, // Keypad Backspace -XKEY_INVALID, // Keypad A -XKEY_INVALID, // Keypad B -XKEY_INVALID, // Keypad C -XKEY_INVALID, // Keypad D -XKEY_INVALID, // Keypad E -XKEY_INVALID, // Keypad F -XKEY_INVALID, // Keypad XOR -XKEY_INVALID, // Keypad ^ -XKEY_INVALID, // Keypad % -XKEY_INVALID, // Keypad < -XKEY_INVALID, // Keypad > -XKEY_INVALID, // Keypad & -XKEY_INVALID, // Keypad && -XKEY_INVALID, // Keypad | -XKEY_INVALID, // Keypad || -XKEY_INVALID, // Keypad : -XKEY_INVALID, // Keypad # -XKEY_INVALID, // Keypad Space -XKEY_INVALID, // Keypad @ -XKEY_INVALID, // Keypad ! -XKEY_INVALID, // Keypad Memory Store -XKEY_INVALID, // Keypad Memory Recall -XKEY_INVALID, // Keypad Memory Clear -XKEY_INVALID, // Keypad Memory Add -XKEY_INVALID, // Keypad Memory Subtract -XKEY_INVALID, // Keypad Memory Multiply -XKEY_INVALID, // Keypad Memory Divide -XKEY_INVALID, // Keypad +/- -XKEY_INVALID, // Keypad Clear -XKEY_INVALID, // Keypad Clear Entry -XKEY_INVALID, // Keypad Binary -XKEY_INVALID, // Keypad Octal -XKEY_INVALID, // Keypad Decimal -XKEY_INVALID, // Keypad Hexadecimal -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_LCONTROL, -XKEY_LSHIFT, -XKEY_LMENU, -XKEY_LWIN, -XKEY_RCONTROL, -XKEY_RSHIFT, -XKEY_RMENU, -XKEY_RWIN, -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -XKEY_INVALID, // Reserved -}; - -static unsigned char ucUSBtoAscii[256] = -{ -0, //XKEY_INVALID, -0, //XKEY_INVALID, -0, //XKEY_INVALID, -0, //XKEY_INVALID, -'a', //XKEY_A, -'b', //XKEY_B, -'c', //XKEY_C, -'d', //XKEY_D, -'e', //XKEY_E, -'f', //XKEY_F, -'g', //XKEY_G, -'h', //XKEY_H, -'i', //XKEY_I, -'j', //XKEY_J, -'k', //XKEY_K, -'l', //XKEY_L, -'m', //XKEY_M, -'n', //XKEY_N, -'o', //XKEY_O, -'p', //XKEY_P, -'q', //XKEY_Q, -'r', //XKEY_R, -'s', //XKEY_S, -'t', //XKEY_T, -'u', //XKEY_U, -'v', //XKEY_V, -'w', //XKEY_W, -'x', //XKEY_X, -'y', //XKEY_Y, -'z', //XKEY_Z, -'1', //XKEY_1, -'2', //XKEY_2, -'3', //XKEY_3, -'4', //XKEY_4, -'5', //XKEY_5, -'6', //XKEY_6, -'7', //XKEY_7, -'8', //XKEY_8, -'9', //XKEY_9, -'0', //XKEY_0, -'\n', //XKEY_RETURN, -27, //XKEY_ESCAPE, -8, //XKEY_BACKSPACE, -9, //XKEY_TAB, -' ', //XKEY_SPACE, -'-', //XKEY_MINUS, -'=', //XKEY_EQUALS, -'[', //XKEY_LBRACE, -']', //XKEY_RBRACE, -'\\', //XKEY_BACKSLASH, -'`', //XKEY_GRAVE, -';', //XKEY_SEMICOLON, -'\'', //XKEY_QUOTE, -'`', //XKEY_GRAVE, -',', //XKEY_COMMA, -'.', //XKEY_PERIOD, -'/', //XKEY_SLASH, -0, //XKEY_CAPSLOCK, -0, //XKEY_F1, -0, //XKEY_F2, -0, //XKEY_F3, -0, //XKEY_F4, -0, //XKEY_F5, -0, //XKEY_F6, -0, //XKEY_F7, -0, //XKEY_F8, -0, //XKEY_F9, -0, //XKEY_F10, -0, //XKEY_F11, -0, //XKEY_F12, -0, //XKEY_PRINTSCREEN, -0, //XKEY_SCROLL_LOCK, -0, //XKEY_PAUSE, -0, //XKEY_INSERT, -0, //XKEY_HOME, -0, //XKEY_PRIOR, -0, //XKEY_DELETE, -0, //XKEY_END, -0, //XKEY_NEXT, -0, //XKEY_RIGHT, -0, //XKEY_LEFT, -0, //XKEY_DOWN, -0, //XKEY_UP, -0, //XKEY_NUMLOCK, -'/', //XKEY_DIVIDE, -'*', //XKEY_MULTIPLY, -'-', //XKEY_SUBTRACT, -'+', //XKEY_ADD, -'\n', //XKEY_NUMPAD_ENTER, -'1', //XKEY_NUMPAD1, -'2', //XKEY_NUMPAD2, -'3', //XKEY_NUMPAD3, -'4', //XKEY_NUMPAD4, -'5', //XKEY_NUMPAD5, -'6', //XKEY_NUMPAD6, -'7', //XKEY_NUMPAD7, -'8', //XKEY_NUMPAD8, -'9', //XKEY_NUMPAD9, -'0', //XKEY_NUMPAD0, -'.', //XKEY_DECIMAL, -'\\', //XKEY_BACKSLASH, -0, //XKEY_APPS, -0, //XKEY_SLEEP, -'=', //XKEY_NUMPADEQUALS, -0, //XKEY_F13, -0, //XKEY_F14, -0, //XKEY_F15, -0, //XKEY_F16, -0, //XKEY_F17, -0, //XKEY_F18, -0, //XKEY_F19, -0, //XKEY_F20, -0, //XKEY_F21, -0, //XKEY_F22, -0, //XKEY_F23, -0, //XKEY_F24, -0, //XKEY_EXECUTE, -0, //XKEY_HELP, -0, //XKEY_MENU, -0, //XKEY_SELECT, -0, //XKEY_BROWSER_STOP, -0, //XKEY_INVALID, // Keyboard Again -0, //XKEY_INVALID, // Keyboard Undo -0, //XKEY_INVALID, // Keyboard Cut -0, //XKEY_INVALID, // Keyboard Copy -0, //XKEY_INVALID, // Keyboard Paste -0, //XKEY_BROWSER_SEARCH, -0, //XKEY_VOLUME_MUTE, -0, //XKEY_VOLUME_UP, -0, //XKEY_VOLUME_DOWN, -0, //XKEY_INVALID, // Keyboard locking caps lock -0, //XKEY_INVALID, // Keyboard locking num lock -0, //XKEY_INVALID, // Keyboard locking scroll lock -'.', //XKEY_DECIMAL, -'=', //XKEY_NUMPADEQUALS, -0, //XKEY_INVALID, // Keyboard International 1 -0, //XKEY_INVALID, // Keyboard International 2 -0, //XKEY_INVALID, // Keyboard International 3 -0, //XKEY_INVALID, // Keyboard International 4 -0, //XKEY_INVALID, // Keyboard International 5 -0, //XKEY_INVALID, // Keyboard International 6 -0, //XKEY_INVALID, // Keyboard International 7 -0, //XKEY_INVALID, // Keyboard International 8 -0, //XKEY_INVALID, // Keyboard International 9 -0, //XKEY_INVALID, // Keyboard Lang 1 -0, //XKEY_KANJI, -0, //XKEY_KANA, -0, //XKEY_INVALID, // Keyboard Lang 4 -0, //XKEY_INVALID, // Keyboard Lang 5 -0, //XKEY_INVALID, // Keyboard Lang 6 -0, //XKEY_INVALID, // Keyboard Lang 7 -0, //XKEY_INVALID, // Keyboard Lang 8 -0, //XKEY_INVALID, // Keyboard Lang 9 -0, //XKEY_INVALID, // Keyboard Alternate Erase -0, //XKEY_INVALID, // Keyboard SysReq/Attention -0, //XKEY_INVALID, // Keyboard Cancel -0, //XKEY_INVALID, // Keyboard Clear -0, //XKEY_INVALID, // Keyboard Prior -0, //XKEY_INVALID, // Keyboard Return -0, //XKEY_INVALID, // Keyboard Separator -0, //XKEY_INVALID, // Keyboard Out -0, //XKEY_INVALID, // Keyboard Oper -0, //XKEY_INVALID, // Keyboard Clear/Again -0, //XKEY_INVALID, // Keyboard CrSel/Props -0, //XKEY_INVALID, // Keyboard ExSel -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Keypad 00 -0, //XKEY_INVALID, // Keypad 000 -0, //XKEY_INVALID, // Thousands Separator -0, //XKEY_INVALID, // Decimal Separator -0, //XKEY_INVALID, // Currency Unit -0, //XKEY_INVALID, // Currency Sub-unit -0, //XKEY_INVALID, // Keypad ( -0, //XKEY_INVALID, // Keypad ) -0, //XKEY_INVALID, // Keypad { -0, //XKEY_INVALID, // Keypad } -0, //XKEY_INVALID, // Keypad Tab -0, //XKEY_INVALID, // Keypad Backspace -0, //XKEY_INVALID, // Keypad A -0, //XKEY_INVALID, // Keypad B -0, //XKEY_INVALID, // Keypad C -0, //XKEY_INVALID, // Keypad D -0, //XKEY_INVALID, // Keypad E -0, //XKEY_INVALID, // Keypad F -0, //XKEY_INVALID, // Keypad XOR -0, //XKEY_INVALID, // Keypad ^ -0, //XKEY_INVALID, // Keypad % -0, //XKEY_INVALID, // Keypad < -0, //XKEY_INVALID, // Keypad > -0, //XKEY_INVALID, // Keypad & -0, //XKEY_INVALID, // Keypad && -0, //XKEY_INVALID, // Keypad | -0, //XKEY_INVALID, // Keypad || -0, //XKEY_INVALID, // Keypad : -0, //XKEY_INVALID, // Keypad # -0, //XKEY_INVALID, // Keypad Space -0, //XKEY_INVALID, // Keypad @ -0, //XKEY_INVALID, // Keypad ! -0, //XKEY_INVALID, // Keypad Memory Store -0, //XKEY_INVALID, // Keypad Memory Recall -0, //XKEY_INVALID, // Keypad Memory Clear -0, //XKEY_INVALID, // Keypad Memory Add -0, //XKEY_INVALID, // Keypad Memory Subtract -0, //XKEY_INVALID, // Keypad Memory Multiply -0, //XKEY_INVALID, // Keypad Memory Divide -0, //XKEY_INVALID, // Keypad +/- -0, //XKEY_INVALID, // Keypad Clear -0, //XKEY_INVALID, // Keypad Clear Entry -0, //XKEY_INVALID, // Keypad Binary -0, //XKEY_INVALID, // Keypad Octal -0, //XKEY_INVALID, // Keypad Decimal -0, //XKEY_INVALID, // Keypad Hexadecimal -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_LCONTROL, -0, //XKEY_LSHIFT, -0, //XKEY_LMENU, -0, //XKEY_LWIN, -0, //XKEY_RCONTROL, -0, //XKEY_RSHIFT, -0, //XKEY_RMENU, -0, //XKEY_RWIN, -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -}; - -static unsigned char ucUSBtoAsciiShifted[256] = -{ -0, //XKEY_INVALID, -0, //XKEY_INVALID, -0, //XKEY_INVALID, -0, //XKEY_INVALID, -'A', //XKEY_A, -'B', //XKEY_B, -'C', //XKEY_C, -'D', //XKEY_D, -'E', //XKEY_E, -'F', //XKEY_F, -'G', //XKEY_G, -'H', //XKEY_H, -'I', //XKEY_I, -'J', //XKEY_J, -'K', //XKEY_K, -'L', //XKEY_L, -'M', //XKEY_M, -'N', //XKEY_N, -'O', //XKEY_O, -'P', //XKEY_P, -'Q', //XKEY_Q, -'R', //XKEY_R, -'S', //XKEY_S, -'T', //XKEY_T, -'U', //XKEY_U, -'V', //XKEY_V, -'W', //XKEY_W, -'X', //XKEY_X, -'Y', //XKEY_Y, -'Z', //XKEY_Z, -'!', //XKEY_1, -'"', //XKEY_2, -'\xA3', //XKEY_3, (�) -'$', //XKEY_4, -'%', //XKEY_5, -'^', //XKEY_6, -'&', //XKEY_7, -'*', //XKEY_8, -'(', //XKEY_9, -')', //XKEY_0, -'\n', //XKEY_RETURN, -27, //XKEY_ESCAPE, -8, //XKEY_BACKSPACE, -9, //XKEY_TAB, -' ', //XKEY_SPACE, -'_', //XKEY_MINUS, -'+', //XKEY_EQUALS, -'{', //XKEY_LBRACE, -'}', //XKEY_RBRACE, -'|', //XKEY_BACKSLASH, -'\xAC', //XKEY_GRAVE, (�) -':', //XKEY_SEMICOLON, -'@', //XKEY_QUOTE, -'\xAC', //XKEY_GRAVE, (�) -'<', //XKEY_COMMA, -'>', //XKEY_PERIOD, -'?', //XKEY_SLASH, -0, //XKEY_CAPSLOCK, -0, //XKEY_F1, -0, //XKEY_F2, -0, //XKEY_F3, -0, //XKEY_F4, -0, //XKEY_F5, -0, //XKEY_F6, -0, //XKEY_F7, -0, //XKEY_F8, -0, //XKEY_F9, -0, //XKEY_F10, -0, //XKEY_F11, -0, //XKEY_F12, -0, //XKEY_PRINTSCREEN, -0, //XKEY_SCROLL_LOCK, -0, //XKEY_PAUSE, -0, //XKEY_INSERT, -0, //XKEY_HOME, -0, //XKEY_PRIOR, -0, //XKEY_DELETE, -0, //XKEY_END, -0, //XKEY_NEXT, -0, //XKEY_RIGHT, -0, //XKEY_LEFT, -0, //XKEY_DOWN, -0, //XKEY_UP, -0, //XKEY_NUMLOCK, -'/', //XKEY_DIVIDE, -'*', //XKEY_MULTIPLY, -'-', //XKEY_SUBTRACT, -'+', //XKEY_ADD, -'\n', //XKEY_NUMPAD_ENTER, -0, //XKEY_NUMPAD1, -0, //XKEY_NUMPAD2, -0, //XKEY_NUMPAD3, -0, //XKEY_NUMPAD4, -0, //XKEY_NUMPAD5, -0, //XKEY_NUMPAD6, -0, //XKEY_NUMPAD7, -0, //XKEY_NUMPAD8, -0, //XKEY_NUMPAD9, -0, //XKEY_NUMPAD0, -0, //XKEY_DECIMAL, -'|', //XKEY_BACKSLASH, -0, //XKEY_APPS, -0, //XKEY_SLEEP, -'=', //XKEY_NUMPADEQUALS, -0, //XKEY_F13, -0, //XKEY_F14, -0, //XKEY_F15, -0, //XKEY_F16, -0, //XKEY_F17, -0, //XKEY_F18, -0, //XKEY_F19, -0, //XKEY_F20, -0, //XKEY_F21, -0, //XKEY_F22, -0, //XKEY_F23, -0, //XKEY_F24, -0, //XKEY_EXECUTE, -0, //XKEY_HELP, -0, //XKEY_MENU, -0, //XKEY_SELECT, -0, //XKEY_BROWSER_STOP, -0, //XKEY_INVALID, // Keyboard Again -0, //XKEY_INVALID, // Keyboard Undo -0, //XKEY_INVALID, // Keyboard Cut -0, //XKEY_INVALID, // Keyboard Copy -0, //XKEY_INVALID, // Keyboard Paste -0, //XKEY_BROWSER_SEARCH, -0, //XKEY_VOLUME_MUTE, -0, //XKEY_VOLUME_UP, -0, //XKEY_VOLUME_DOWN, -0, //XKEY_INVALID, // Keyboard locking caps lock -0, //XKEY_INVALID, // Keyboard locking num lock -0, //XKEY_INVALID, // Keyboard locking scroll lock -0, //XKEY_DECIMAL, -'=', //XKEY_NUMPADEQUALS, -0, //XKEY_INVALID, // Keyboard International 1 -0, //XKEY_INVALID, // Keyboard International 2 -0, //XKEY_INVALID, // Keyboard International 3 -0, //XKEY_INVALID, // Keyboard International 4 -0, //XKEY_INVALID, // Keyboard International 5 -0, //XKEY_INVALID, // Keyboard International 6 -0, //XKEY_INVALID, // Keyboard International 7 -0, //XKEY_INVALID, // Keyboard International 8 -0, //XKEY_INVALID, // Keyboard International 9 -0, //XKEY_INVALID, // Keyboard Lang 1 -0, //XKEY_KANJI, -0, //XKEY_KANA, -0, //XKEY_INVALID, // Keyboard Lang 4 -0, //XKEY_INVALID, // Keyboard Lang 5 -0, //XKEY_INVALID, // Keyboard Lang 6 -0, //XKEY_INVALID, // Keyboard Lang 7 -0, //XKEY_INVALID, // Keyboard Lang 8 -0, //XKEY_INVALID, // Keyboard Lang 9 -0, //XKEY_INVALID, // Keyboard Alternate Erase -0, //XKEY_INVALID, // Keyboard SysReq/Attention -0, //XKEY_INVALID, // Keyboard Cancel -0, //XKEY_INVALID, // Keyboard Clear -0, //XKEY_INVALID, // Keyboard Prior -0, //XKEY_INVALID, // Keyboard Return -0, //XKEY_INVALID, // Keyboard Separator -0, //XKEY_INVALID, // Keyboard Out -0, //XKEY_INVALID, // Keyboard Oper -0, //XKEY_INVALID, // Keyboard Clear/Again -0, //XKEY_INVALID, // Keyboard CrSel/Props -0, //XKEY_INVALID, // Keyboard ExSel -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Keypad 00 -0, //XKEY_INVALID, // Keypad 000 -0, //XKEY_INVALID, // Thousands Separator -0, //XKEY_INVALID, // Decimal Separator -0, //XKEY_INVALID, // Currency Unit -0, //XKEY_INVALID, // Currency Sub-unit -0, //XKEY_INVALID, // Keypad ( -0, //XKEY_INVALID, // Keypad ) -0, //XKEY_INVALID, // Keypad { -0, //XKEY_INVALID, // Keypad } -0, //XKEY_INVALID, // Keypad Tab -0, //XKEY_INVALID, // Keypad Backspace -0, //XKEY_INVALID, // Keypad A -0, //XKEY_INVALID, // Keypad B -0, //XKEY_INVALID, // Keypad C -0, //XKEY_INVALID, // Keypad D -0, //XKEY_INVALID, // Keypad E -0, //XKEY_INVALID, // Keypad F -0, //XKEY_INVALID, // Keypad XOR -0, //XKEY_INVALID, // Keypad ^ -0, //XKEY_INVALID, // Keypad % -0, //XKEY_INVALID, // Keypad < -0, //XKEY_INVALID, // Keypad > -0, //XKEY_INVALID, // Keypad & -0, //XKEY_INVALID, // Keypad && -0, //XKEY_INVALID, // Keypad | -0, //XKEY_INVALID, // Keypad || -0, //XKEY_INVALID, // Keypad : -0, //XKEY_INVALID, // Keypad # -0, //XKEY_INVALID, // Keypad Space -0, //XKEY_INVALID, // Keypad @ -0, //XKEY_INVALID, // Keypad ! -0, //XKEY_INVALID, // Keypad Memory Store -0, //XKEY_INVALID, // Keypad Memory Recall -0, //XKEY_INVALID, // Keypad Memory Clear -0, //XKEY_INVALID, // Keypad Memory Add -0, //XKEY_INVALID, // Keypad Memory Subtract -0, //XKEY_INVALID, // Keypad Memory Multiply -0, //XKEY_INVALID, // Keypad Memory Divide -0, //XKEY_INVALID, // Keypad +/- -0, //XKEY_INVALID, // Keypad Clear -0, //XKEY_INVALID, // Keypad Clear Entry -0, //XKEY_INVALID, // Keypad Binary -0, //XKEY_INVALID, // Keypad Octal -0, //XKEY_INVALID, // Keypad Decimal -0, //XKEY_INVALID, // Keypad Hexadecimal -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_LCONTROL, -0, //XKEY_LSHIFT, -0, //XKEY_LMENU, -0, //XKEY_LWIN, -0, //XKEY_RCONTROL, -0, //XKEY_RSHIFT, -0, //XKEY_RMENU, -0, //XKEY_RWIN, -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -0, //XKEY_INVALID, // Reserved -}; - -#endif diff --git a/lib/usb/sys/linuxwrapper.c b/lib/usb/sys/linuxwrapper.c deleted file mode 100644 index 37ec2720d..000000000 --- a/lib/usb/sys/linuxwrapper.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * USB support based on Linux kernel source - * - * 2003-06-21 Georg Acher (georg@acher.org) - * - * Concept: - * - * 1) Forget all device interrupts, scheduling, semaphores, threads etc. - * 1a) Forget all DMA and PCI helper functions - * 2) Forget usbdevfs, procfs and ioctls - * 3) Emulate OHCI interrupts and root hub timer by polling - * 4) Emulate hub kernel thread by polling - * 5) Emulate synchronous USB-messages (usb_*_msg) with busy waiting - * - * To be done: - * 6) Remove code bloat - * - */ - -#include "../usb_wrapper.h" - -/* internal state */ - -static struct pci_dev *pci_probe_dev; -extern int (*thread_handler)(void*); -extern void* thread_parm; - -struct my_irqs reg_irqs[MAX_IRQS]; -int num_irqs; -int need_wakeup; - -int my_jiffies; - -struct timer_list *main_timer_list[MAX_TIMERS]; -struct dummy_process act_cur={0}; -struct dummy_process *my_current; - -int (*thread_handler)(void*); -void* thread_parm; - -#define MAX_DRVS 8 -static struct device_driver *m_drivers[MAX_DRVS]; -static int drvs_num; - -/*------------------------------------------------------------------------*/ -/* - * Helper functions for top-level system - */ -/*------------------------------------------------------------------------*/ -void init_wrapper(void) -{ - int n; - for(n=0;nfunction && main_timer_list[n]->expires) - { - void (*function)(unsigned long)=main_timer_list[n]->function; - unsigned long data=main_timer_list[n]->data; - main_timer_list[n]->expires=0; - - main_timer_list[n]=NULL; // remove timer -// printk("do timer %i fn %p\n",n,function); - - function(data); - } - } -} -/*------------------------------------------------------------------------*/ -// Purpose: Remember thread procedure and data in global var -int my_kernel_thread(int (*handler)(void*), void* parm, int flags) -{ - thread_handler=handler; - thread_parm=parm; - return 42; // PID :-) -} -/*------------------------------------------------------------------------*/ -/* Device management - * As simple as possible, but as complete as necessary ... - */ -/*------------------------------------------------------------------------*/ - - -/* calls probe function for hotplug (which does device matching), this is the -only link between usbcore and the registered device drivers! */ -int my_device_add(struct device *dev) -{ - int n,found=0; -// printk("drv_num %i %p %p\n",drvs_num,m_drivers[0]->probe,m_drivers[1]->probe); - if (dev->driver) - { - if (dev->driver->probe) - return dev->driver->probe(dev); - } - else - { - for(n=0;nprobe) - { - dev->driver=m_drivers[n]; -// printk("probe%i %p ",n,m_drivers[n]->probe); - if (m_drivers[n]->probe(dev) == 0) - { -// return 0; - found=1; - } - } - } - if (found) return 0; - } - dev->driver=NULL; - return -ENODEV; -} -/*------------------------------------------------------------------------*/ -int my_driver_register(struct device_driver *driver) -{ - - if (drvs_numprobe); - m_drivers[drvs_num++]=driver; - return 0; - } - return -1; -} -/*------------------------------------------------------------------------*/ -int my_device_unregister(struct device *dev) -{ - if (dev->driver && dev->driver->remove) - dev->driver->remove(dev); - return 0; - -} -/*------------------------------------------------------------------------*/ -struct device *my_get_device(struct device *dev) -{ - return NULL; -} -/*------------------------------------------------------------------------*/ -void my_device_initialize(struct device *dev) -{ -} -/*------------------------------------------------------------------------*/ -void my_wake_up(void* p) -{ - need_wakeup=1; -} -/*------------------------------------------------------------------------*/ -/* wait until woken up (only one wait allowed!) */ -int my_schedule_timeout(int x) -{ - int wait=1; - x+=10; // safety -// printk("schedule_timeout %i\n",x); - while(x>0) - { - do_all_timers(); -#ifndef HAVE_IRQS - handle_irqs(-1); - -#endif - if (need_wakeup) - break; - wait_ms(wait); - inc_jiffies(wait); - x-=wait; - } - need_wakeup=0; -// printk("schedule DONE!!!!!!\n"); - return x; -} -/*------------------------------------------------------------------------*/ -void my_wait_for_completion(struct completion *x) -{ - int n=100; -// printk("wait for completion\n"); - while(!x->done && (n>0)) - { - do_all_timers(); -#ifndef HAVE_IRQS - handle_irqs(-1); - -#endif - wait_ms(10); - n--; - } -// printk("wait for completion done %i\n",x->done); -} -/*------------------------------------------------------------------------*/ -// Helper for pci_module_init -/*------------------------------------------------------------------------*/ -int my_pci_module_init(struct pci_driver *x) -{ - struct pci_dev *dev=pci_probe_dev; - const struct pci_device_id *id=NULL; - if (!pci_probe_dev) - { - printk(KERN_ERR "PCI device not set!\n"); - return 0; - } - x->probe(dev, id); - return 0; -} -/*------------------------------------------------------------------------*/ -struct pci_dev *my_pci_find_slot(int a,int b) -{ - return NULL; -} -/*------------------------------------------------------------------------*/ -int my_request_irq(unsigned int irq, - int (*handler)(int,void *, struct pt_regs *), - unsigned long mode, const char *desc, void *data) -{ - if (num_irqscontext; - int i; - - if (urb->status) return; - - memcpy(kbd->kbd_pkt, urb->transfer_buffer, 8); - - current_keyboard_key = kbd->kbd_pkt[2]; - - UpdateKeyboardQueue((XKEYBOARD_DATA*)kbd->kbd_pkt); - - - usb_submit_urb(urb,GFP_ATOMIC); - -} - -static int usb_kbd_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct urb *urb; - struct usb_device *udev = interface_to_usbdev (intf); - struct usb_endpoint_descriptor *ep_irq_in; - struct usb_endpoint_descriptor *ep_irq_out; - struct usb_kbd_info *usbk; - - int i, pipe, maxp; - char *buf; - - usbk=(struct usb_kbd_info *)kmalloc(sizeof(struct usb_kbd_info),0); - if (!usbk) return -1; - - urb=usb_alloc_urb(0,0); - if (!urb) return -1; - - usbk->urb=urb; - - ep_irq_in = &intf->altsetting[0].endpoint[0].desc; - usb_fill_int_urb(urb, udev, - usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), - usbk->kbd_pkt, 8, usb_kbd_irq, - usbk, 8); - - usb_submit_urb(urb,GFP_ATOMIC); - usb_set_intfdata(intf,usbk); - - return 0; -} - - -static void usb_kbd_disconnect(struct usb_interface *intf) -{ - struct usb_kbd_info *usbk = usb_get_intfdata (intf); - usbprintk("Keyboard disconnected\n "); - usb_unlink_urb(usbk->urb); - usb_free_urb(usbk->urb); - kfree(usbk); -} - -static struct usb_device_id usb_kbd_id_table [] = { - { USB_INTERFACE_INFO(3, 1, 1) }, - { } /* Terminating entry */ -}; - - -static struct usb_driver usb_kbd_driver = { - .owner = THIS_MODULE, - .name = "keyboard", - .probe = usb_kbd_probe, - .disconnect = usb_kbd_disconnect, - .id_table = usb_kbd_id_table, -}; - -void UsbKeyBoardInit(void) -{ - if(InitKeyboardQueue(40) < 0) - return; - - if (usb_register(&usb_kbd_driver) < 0) { - usbprintk("Unable to register Keyboard driver"); - return; - } -} - -void UsbKeyBoardRemove(void) { - usb_deregister(&usb_kbd_driver); - - FreeKeyboardQueue(); -} - -// -// Keyboard queue handling functions -// -#include "keyboardcodes.h" - -int InitKeyboardQueue(size_t size) -{ - pKeyQueue = (XKEYBOARD_STROKE*)kmalloc(size * sizeof(XKEYBOARD_STROKE), 0); - if(!pKeyQueue) - return -1; - - memset(pKeyQueue, 0x00, size * sizeof(XKEYBOARD_STROKE)); - - memset(&XKEYBOARD_Current, 0x00, sizeof(XKEYBOARD_DATA)); - memset(&XKEYBOARD_Last, 0x00, sizeof(XKEYBOARD_DATA)); - - iKeyWritePos = 0; - iKeyReadPos = 0; - iKeyQueueSize = size; - - return 0; -} - -void FreeKeyboardQueue(void) -{ - if(pKeyQueue) - { - kfree(pKeyQueue); - pKeyQueue = NULL; - } - - iKeyWritePos = 0; - iKeyReadPos = 0; - iKeyQueueSize = 0; -} - -void UpdateKeyboardQueue(XKEYBOARD_DATA* pData) -{ - XKEYBOARD_DATA keysUp; - XKEYBOARD_DATA keysDown; - BOOL bKeyToAdd; - - if(!pKeyQueue) - return; - - memcpy(&XKEYBOARD_Last, &XKEYBOARD_Current, sizeof(XKEYBOARD_DATA)); - memcpy(&XKEYBOARD_Current, pData, sizeof(XKEYBOARD_DATA)); - - keysDown.ucModifiers = XKEYBOARD_Current.ucModifiers; - keysDown.ucModifiers &= ~XKEYBOARD_Last.ucModifiers; - - keysUp.ucModifiers = XKEYBOARD_Last.ucModifiers; - keysUp.ucModifiers &= ~XKEYBOARD_Current.ucModifiers; - - // Keys Pressed - for(int iCurKey=0; iCurKey<6; iCurKey++) - { - bKeyToAdd = TRUE; - if(XKEYBOARD_Current.ucScanCodes[iCurKey] > 0x03) - { - for(int iLastKey=0; iLastKey<6; iLastKey++) - { - if(XKEYBOARD_Current.ucScanCodes[iCurKey] == XKEYBOARD_Last.ucScanCodes[iLastKey]) - { - bKeyToAdd = FALSE; - break; - } - } - } - else - bKeyToAdd = FALSE; - - keysDown.ucScanCodes[iCurKey] = bKeyToAdd ? XKEYBOARD_Current.ucScanCodes[iCurKey] : 0; - } - - //Keys Released - for(int iLastKey=0; iLastKey<6; iLastKey++) - { - bKeyToAdd = TRUE; - if(XKEYBOARD_Last.ucScanCodes[iLastKey] > 0x03) - { - for(int iCurKey=0; iCurKey<6; iCurKey++) - { - if(XKEYBOARD_Last.ucScanCodes[iLastKey] == XKEYBOARD_Current.ucScanCodes[iCurKey]) - { - bKeyToAdd = FALSE; - break; - } - } - } - else - bKeyToAdd = FALSE; - - keysUp.ucScanCodes[iLastKey] = bKeyToAdd ? XKEYBOARD_Last.ucScanCodes[iLastKey] : 0; - } - - // Add keys to the queue - for(int i=0; i<8; i++) - { - bKeyToAdd = FALSE; - - if( (keysUp.ucModifiers >> i) & 1 ) - { - if(i==0 || i==4) - bCtrl = FALSE; - if(i==1 || i==5) - bShift = FALSE; - if(i==2 || i==6) - bAlt = FALSE; - - pKeyQueue[iKeyWritePos].ucFlags = XKEYBOARD_KEYUP; - bKeyToAdd = TRUE; - } - if( (keysDown.ucModifiers >> i) & 1 ) - { - if(i==0 || i==4) - bCtrl = TRUE; - if(i==1 || i==5) - bShift = TRUE; - if(i==2 || i==6) - bAlt = TRUE; - - pKeyQueue[iKeyWritePos].ucFlags = 0; - bKeyToAdd = TRUE; - } - if(bKeyToAdd) - { - pKeyQueue[iKeyWritePos].ucKeyCode = ucUSBtoKey[i + USB_KEYBOARD_USAGE_LCONTROL]; - pKeyQueue[iKeyWritePos].ucAsciiValue = 0; - - iKeyWritePos++; - if(iKeyWritePos >= iKeyQueueSize) - iKeyWritePos = 0; - } - } - - for(int i=0; i<6; i++) - { - if(keysUp.ucScanCodes[i] > 0x03) - { - pKeyQueue[iKeyWritePos].ucKeyCode = ucUSBtoKey[keysUp.ucScanCodes[i]]; - pKeyQueue[iKeyWritePos].ucFlags = XKEYBOARD_KEYUP; - - if( bShift ) - pKeyQueue[iKeyWritePos].ucAsciiValue = ucUSBtoAsciiShifted[keysUp.ucScanCodes[i]]; - else - pKeyQueue[iKeyWritePos].ucAsciiValue = ucUSBtoAscii[keysUp.ucScanCodes[i]]; - - //Need to add flags for shift, ctrl etc here - if(bShift) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_SHIFT; - - if(bCtrl) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_CONTROL; - - if(bAlt) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_ALT; - - iKeyWritePos++; - if(iKeyWritePos >= iKeyQueueSize) - iKeyWritePos = 0; - } - } - - for(int i=0; i<6; i++) - { - if(keysDown.ucScanCodes[i] > 0x03) - { - pKeyQueue[iKeyWritePos].ucKeyCode = ucUSBtoKey[keysDown.ucScanCodes[i]]; - pKeyQueue[iKeyWritePos].ucFlags = 0; - - if( bShift ) - pKeyQueue[iKeyWritePos].ucAsciiValue = ucUSBtoAsciiShifted[keysDown.ucScanCodes[i]]; - else - pKeyQueue[iKeyWritePos].ucAsciiValue = ucUSBtoAscii[keysDown.ucScanCodes[i]]; - - //Need to add flags for shift, ctrl etc here - if(bShift) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_SHIFT; - - if(bCtrl) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_CONTROL; - - if(bAlt) - pKeyQueue[iKeyWritePos].ucFlags |= XKEYBOARD_ALT; - - iKeyWritePos++; - if(iKeyWritePos >= iKeyQueueSize) - iKeyWritePos = 0; - } - } - -} - -int GetKeyboardStroke(XKEYBOARD_STROKE *pStroke) -{ - if(!pStroke) - return -1; - - memset(pStroke, 0x00, sizeof(XKEYBOARD_STROKE)); - - if(!pKeyQueue) - return -1; - - if(iKeyReadPos == iKeyWritePos) - return -1; - - memcpy(pStroke, &pKeyQueue[iKeyReadPos], sizeof(XKEYBOARD_STROKE)); - - iKeyReadPos++; - if(iKeyReadPos >= iKeyQueueSize) - iKeyReadPos = 0; - - return 0; -} diff --git a/lib/usb/sys/usbmouse.c b/lib/usb/sys/usbmouse.c deleted file mode 100644 index 47e67a5cd..000000000 --- a/lib/usb/sys/usbmouse.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "../usb_wrapper.h" - - -/* Stores Mouse state */ -struct xmouse_data XMOUSE_current; - -struct usb_mouse_info { - struct urb *urb; - unsigned char data[8]; - //unsigned char old[8]; -}; - -static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs) -{ - struct usb_mouse_info *mouse = urb->context; - int i; - - if (urb->status) return; - - memcpy(mouse->data, urb->transfer_buffer, 8); - - XMOUSE_current.buttons = mouse->data[0]; - XMOUSE_current.x = mouse->data[1]; - XMOUSE_current.y = mouse->data[2]; - XMOUSE_current.wheel = mouse->data[3]; - - usb_submit_urb(urb,GFP_ATOMIC); - -} - -static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct urb *urb; - struct usb_device *udev = interface_to_usbdev (intf); - struct usb_endpoint_descriptor *ep_irq_in; - struct usb_endpoint_descriptor *ep_irq_out; - struct usb_mouse_info *usbmouse; - - int i, pipe, maxp; - char *buf; - - usbmouse=(struct usb_mouse_info *)kmalloc(sizeof(struct usb_mouse_info),0); - if (!usbmouse) return -1; - - urb=usb_alloc_urb(0,0); - if (!urb) return -1; - - usbmouse->urb=urb; - - ep_irq_in = &intf->altsetting[0].endpoint[0].desc; - usb_fill_int_urb(urb, udev, - usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), - usbmouse->data, 8, usb_mouse_irq, - usbmouse, 8); - - usb_submit_urb(urb,GFP_ATOMIC); - usb_set_intfdata(intf,usbmouse); - return 0; -} - - -static void usb_mouse_disconnect(struct usb_interface *intf) -{ - struct usb_mouse_info *usbmouse = usb_get_intfdata (intf); - usbprintk("Mouse disconnected\n "); - usb_unlink_urb(usbmouse->urb); - usb_free_urb(usbmouse->urb); - kfree(usbmouse); -} - -static struct usb_device_id usb_mouse_id_table [] = { - { USB_INTERFACE_INFO(3, 1, 2) }, - { } /* Terminating entry */ -}; - - -static struct usb_driver usb_mouse_driver = { - .owner = THIS_MODULE, - .name = "mouse", - .probe = usb_mouse_probe, - .disconnect = usb_mouse_disconnect, - .id_table = usb_mouse_id_table, -}; - -void UsbMouseInit(void) -{ - memset(&XMOUSE_current, 0, sizeof(struct xmouse_data)); - - if (usb_register(&usb_mouse_driver) < 0) { - usbprintk("Unable to register Mouse driver"); - return; - } -} - -void UsbMouseRemove(void) { - usb_deregister(&usb_mouse_driver); -} diff --git a/lib/usb/sys/xpad.c b/lib/usb/sys/xpad.c deleted file mode 100644 index 4b2040d4e..000000000 --- a/lib/usb/sys/xpad.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Simple XPAD driver for XBOX - * - * (c) 2003-07-04, Georg Acher (georg@acher.org) - * - * Inspired by linux/drivers/usb/input/xpad.c - * by Marko Friedemann - * - */ - - - -#include "../usb_wrapper.h" -#include "usb/include/config.h" - -#include - -// history for the Rising - falling events -unsigned char xpad_button_history[7]; - -/* Stores time and XPAD state */ -struct xpad_data XPAD_current[4]; -struct xpad_data XPAD_last[4]; - -struct xpad_info -{ - struct urb *urb; - int num; - unsigned char data[32]; -}; - -int xpad_num=0; -/*------------------------------------------------------------------------*/ -static void xpad_irq(struct urb *urb, struct pt_regs *regs) -{ - struct xpad_info *xpi = urb->context; - unsigned char* data= urb->transfer_buffer; - - struct xpad_data *xp=&XPAD_current[xpi->num]; - struct xpad_data *xpo=&XPAD_last[xpi->num]; - - /* This hack means the xpad event always gets posted to the - * first xpad - avoids problems iterating over multiple xpads - * as the xpi->num entries are not reused when xpads are - * connected, then removed */ - - //struct xpad_data *xp=&XPAD_current[0]; - //struct xpad_data *xpo=&XPAD_last[0]; - - if (xpi->num<0 || xpi->num>3) - return; - - memcpy(xpo,xp,sizeof(struct xpad_data)); - - xp->stick_left_x=(short) (((short)data[13] << 8) | data[12]); - xp->stick_left_y=(short) (((short)data[15] << 8) | data[14]); - xp->stick_right_x=(short) (((short)data[17] << 8) | data[16]); - xp->stick_right_y=(short) (((short)data[19] << 8) | data[18]); - xp->trig_left= data[10]; - xp->trig_right= data[11]; - xp->pad = data[2]&0xf; - xp->state = (data[2]>>4)&0xf; - xp->keys[0] = data[4]; // a - xp->keys[1] = data[5]; // b - xp->keys[2] = data[6]; // x - xp->keys[3] = data[7]; // y - xp->keys[4] = data[8]; // black - xp->keys[5] = data[9]; // white - xp->timestamp=jiffies; // FIXME: A more uniform flowing time would be better... - usb_submit_urb(urb,GFP_ATOMIC); - -} -/*------------------------------------------------------------------------*/ - -static int GetPadNum(const char* szDevPath) -{ - int pos = (XboxHardwareInfo.Flags & XBOX_HW_FLAG_INTERNAL_USB_HUB) ? 2 : 0; - int portchar = szDevPath[pos]; - - switch(portchar) - { - case '3': - return 0; break; - case '4': - return 1; break; - case '1': - return 2; break; - case '2': - return 3; break; - } - - return -1; -} - -static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct urb *urb; - struct usb_device *udev = interface_to_usbdev (intf); - struct usb_endpoint_descriptor *ep_irq_in; - struct usb_endpoint_descriptor *ep_irq_out; - struct xpad_info *xpi; - - int padnum = GetPadNum(udev->devpath); - if(padnum < 0) return -1; - - - xpi=kmalloc(sizeof(struct xpad_info),GFP_KERNEL); - if (!xpi) return -1; - - urb=usb_alloc_urb(0,0); - if (!urb) return -1; - - xpi->urb=urb; - xpi->num=padnum; //xpad_num; - ep_irq_in = &intf->altsetting[0].endpoint[0].desc; - usb_fill_int_urb(urb, udev, - usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), - xpi->data, 32, xpad_irq, - xpi, 32); - - usb_submit_urb(urb,GFP_ATOMIC); - - usb_set_intfdata(intf,xpi); - usbprintk("XPAD #%i connected\n",xpad_num); - #ifdef XPAD_VIBRA_STARTUP - { - // Brum Brum - char data1[6]={0,6,0,120,0,120}; - char data2[6]={0,6,0,0,0,0}; - int dummy; - - usb_bulk_msg(udev, usb_sndbulkpipe(udev,2), - data1, 6, &dummy, 500); - wait_ms(500); - usb_bulk_msg(udev, usb_sndbulkpipe(udev,2), - data2, 6, &dummy, 500); - } - #endif - - XPAD_current[xpi->num].hPresent = 1; - - xpad_num++; - - return 0; -} -/*------------------------------------------------------------------------*/ -static void xpad_disconnect(struct usb_interface *intf) -{ - struct xpad_info *xpi=usb_get_intfdata (intf); - usb_unlink_urb(xpi->urb); - usb_free_urb(xpi->urb); - - memset(&XPAD_current[xpi->num], 0x00, sizeof(struct xpad_data)); - memset(&XPAD_last[xpi->num], 0x00, sizeof(struct xpad_data)); - - kfree(xpi); - xpad_num--; -} -/*------------------------------------------------------------------------*/ -static struct usb_device_id xpad_ids [] = { - { USB_INTERFACE_INFO(88, 66, 0) }, /* Xbox Controller Interfaces */ - { } /* Terminating entry */ -}; - - -static struct usb_driver xpad_driver = { - .owner = THIS_MODULE, - .name = "XPAD", - .probe = xpad_probe, - .disconnect = xpad_disconnect, - .id_table = xpad_ids, -}; - -/*------------------------------------------------------------------------*/ -void XPADInit(void) -{ - int n; - for(n=0;n<4;n++) - { - memset(&XPAD_current[n], 0, sizeof(struct xpad_data)); - memset(&XPAD_last[n], 0, sizeof(struct xpad_data)); - } - memset(&xpad_button_history, 0, sizeof(xpad_button_history)); - - usbprintk("XPAD probe %p ",xpad_probe); - if (usb_register(&xpad_driver) < 0) { - err("Unable to register XPAD driver"); - return; - } -} -/*------------------------------------------------------------------------*/ -void XPADRemove(void) { - usb_deregister(&xpad_driver); -} - -/*------------------------------------------------------------------------*/ - - - diff --git a/lib/usb/sys/xremote.c b/lib/usb/sys/xremote.c deleted file mode 100644 index 7db0414e4..000000000 --- a/lib/usb/sys/xremote.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/* - * $Id$ - * - * Copyright (c) 2002 Steven Toth - * - * XBOX DVD dongle infrared device driver for the input driver suite. - * - * This work was derived from the usbkbd.c kernel module. - * - * History: - * - * 2002_08_31 - 0.1 - Initial release - * 2002_09_02 - 0.2 - Added IOCTL support enabling user space administration - * of the translation matrix. - * - */ - -#include "../usb_wrapper.h" - - -u16 current_remote_key; -u8 remotekeyIsRepeat; - -struct xremote_info -{ - struct urb *urb; - unsigned char irpkt[8]; -}; - -/* USB callback completion handler - * Code in transfer_buffer is received as six unsigned chars - * Example PLAY=00 06 ea 0a 40 00 - * The command is located in byte[2], the rest are ignored. - * Key position is byte[4] bit0 (7-0 format) 0=down, 1=up - * All other bits are unknown / now required. - */ - -static void xremote_irq(struct urb *urb, struct pt_regs *regs) -{ - struct xremote_info *xri = urb->context; - - if (urb->status) return; - if (urb->actual_length < 6) return; - - /* Messy/unnecessary, fix this */ - memcpy(xri->irpkt, urb->transfer_buffer, 6); - - /* Set the key action based in the sent action */ - current_remote_key = ((xri->irpkt[2] & 0xff)<<8) | (xri->irpkt[3] & 0xff); - - if (((xri->irpkt[4] & 0xff) + ((xri->irpkt[5] & 0xff ) << 8))>0x41) { - remotekeyIsRepeat=0; - } - else remotekeyIsRepeat=1; - - usb_submit_urb(urb,GFP_ATOMIC); -} - -static int xremote_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - struct urb *urb; - struct usb_device *udev = interface_to_usbdev (intf); - struct usb_endpoint_descriptor *ep_irq_in; - struct usb_endpoint_descriptor *ep_irq_out; - struct xremote_info *xri; - - xri=(struct xremote_info *)kmalloc(sizeof(struct xremote_info),0); - if (!xri) return -1; - - urb=usb_alloc_urb(0,0); - if (!urb) return -1; - - xri->urb=urb; - - ep_irq_in = &intf->altsetting[0].endpoint[0].desc; - usb_fill_int_urb(urb, udev, - usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), - xri->irpkt, 8, xremote_irq, - xri, 8); - - usb_submit_urb(urb,GFP_ATOMIC); - usb_set_intfdata(intf,xri); - - usbprintk("DVD Remote connected\n"); - - return 0; -} - -static void xremote_disconnect(struct usb_interface *intf) -{ - struct xremote_info *xri = usb_get_intfdata (intf); - usbprintk("DVD Remote disconnected\n "); - usb_unlink_urb(xri->urb); - usb_free_urb(xri->urb); - kfree(xri); -} - -static struct usb_device_id xremote_id_table [] = { - { USB_DEVICE(0x040b, 0x6521) }, /* Gamester Xbox DVD Movie Playback Kit IR */ - { USB_DEVICE(0x045e, 0x0284) }, /* Microsoft Xbox DVD Movie Playback Kit IR */ - { USB_DEVICE(0x0000, 0x0000) }, // nothing detected - FAIL - { } /* Terminating entry */ -}; - -static struct usb_driver xremote_driver = { - .owner = THIS_MODULE, - .name = "XRemote", - .probe = xremote_probe, - .disconnect = xremote_disconnect, - .id_table = xremote_id_table, -}; - -void XRemoteInit(void) -{ - - current_remote_key=0; - usbprintk("XRemote probe %p ",xremote_probe); - if (usb_register(&xremote_driver) < 0) { - err("Unable to register XRemote driver"); - return; - } -} - -void XRemoteRemove(void) { - usb_deregister(&xremote_driver); -} diff --git a/lib/usb/usb_wrapper.h b/lib/usb/usb_wrapper.h deleted file mode 100644 index 8a07cacc7..000000000 --- a/lib/usb/usb_wrapper.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "usb/include/linux_wrapper.h" -#define __KERNEL__ -#undef CONFIG_PCI -#define CONFIG_PCI - -#include "usb/include/linux/usb.h" - -#include diff --git a/samples/httpd/main.c b/samples/httpd/main.c index fe1474505..53c71a6b8 100644 --- a/samples/httpd/main.c +++ b/samples/httpd/main.c @@ -7,7 +7,6 @@ #include "lwip/timeouts.h" #include "netif/etharp.h" #include "pktdrv.h" -#include #include #include #include diff --git a/samples/httpd_bsd/main.c b/samples/httpd_bsd/main.c index 337ae929b..81a2a32ab 100644 --- a/samples/httpd_bsd/main.c +++ b/samples/httpd_bsd/main.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/samples/sdl_gamecontroller/main.c b/samples/sdl_gamecontroller/main.c index d9129bfe8..4528d4541 100644 --- a/samples/sdl_gamecontroller/main.c +++ b/samples/sdl_gamecontroller/main.c @@ -8,6 +8,7 @@ int main(void) { SDL_GameController *pad = NULL; + static SDL_Event e; bool pbk_init = false, sdl_init = false; XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); @@ -18,17 +19,6 @@ int main(void) goto wait_then_cleanup; } - if (SDL_NumJoysticks() < 1) { - debugPrint("Please connect gamepad\n"); - goto wait_then_cleanup; - } - - pad = SDL_GameControllerOpen(0); - if (pad == NULL) { - debugPrint("Failed to open gamecontroller 0\n"); - goto wait_then_cleanup; - } - pbk_init = pb_init() == 0; if (!pbk_init) { debugPrint("pbkit init failed\n"); @@ -44,39 +34,73 @@ int main(void) pb_fill(0, 0, 640, 480, 0); pb_erase_text_screen(); + while (SDL_PollEvent(&e)) { + if (e.type == SDL_CONTROLLERDEVICEADDED) { + SDL_GameController *new_pad = SDL_GameControllerOpen(e.cdevice.which); + if (pad == NULL) { + pad = new_pad; + } + } + else if (e.type == SDL_CONTROLLERDEVICEREMOVED) { + if (pad == SDL_GameControllerFromInstanceID(e.cdevice.which)) { + pad = NULL; + } + SDL_GameControllerClose(SDL_GameControllerFromInstanceID(e.cdevice.which)); + } + else if (e.type == SDL_CONTROLLERBUTTONDOWN) { + if (e.cbutton.button == SDL_CONTROLLER_BUTTON_START) { + pad = (SDL_GameControllerFromInstanceID(e.cdevice.which)); + } + } + } + SDL_GameControllerUpdate(); - pb_print( - "Axis:\n" - "- Lstick: x=%d, y=%d\n" - "- Rstick: x=%d, y=%d\n" - "- Ltrig: %d\n" - "- Rtrig: %d\n" - "Buttons:\n" - "- A:%d B:%d X:%d Y:%d\n" - "- Back:%d Start:%d White:%d Black:%d\n" - "- Up:%d Down:%d Left:%d Right:%d\n" - "- Lstick:%d, Rstick:%d\n", - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTX), - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTY), - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_RIGHTX), - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_RIGHTY), - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERLEFT), - SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERRIGHT), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_A), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_B), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_X), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_Y), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_BACK), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_START), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_UP), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_DOWN), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_LEFT), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_LEFTSTICK), - SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_RIGHTSTICK)); + if (pad == NULL) { + pb_print("Press start on a controller to test\n"); + } + else { + pb_print( + "Testing Controller %d.\n" + "Press Start on another controller to test\n\n" + "Axis:\n" + "- Lstick: x=%d, y=%d\n" + "- Rstick: x=%d, y=%d\n" + "- Ltrig: %d\n" + "- Rtrig: %d\n" + "Buttons:\n" + "- A:%d B:%d X:%d Y:%d\n" + "- Back:%d Start:%d White:%d Black:%d\n" + "- Up:%d Down:%d Left:%d Right:%d\n" + "- Lstick:%d, Rstick:%d\n" + "- Vendor: %04x Product: %04x\n", + SDL_GameControllerGetPlayerIndex(pad), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTX), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTY), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_RIGHTX), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_RIGHTY), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERLEFT), + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERRIGHT), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_A), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_B), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_X), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_Y), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_BACK), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_START), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_LEFTSHOULDER), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_UP), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_DOWN), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_LEFT), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_DPAD_RIGHT), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_LEFTSTICK), + SDL_GameControllerGetButton(pad, SDL_CONTROLLER_BUTTON_RIGHTSTICK), + SDL_GameControllerGetVendor(pad), SDL_GameControllerGetProduct(pad) + ); + SDL_GameControllerRumble(pad, SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERLEFT) * 2, + SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_TRIGGERRIGHT) * 2, + 100); + } pb_draw_text_screen(); while (pb_busy()); while (pb_finished()); @@ -97,4 +121,4 @@ int main(void) } return 0; -} +} \ No newline at end of file diff --git a/samples/usb/Makefile b/samples/usb/Makefile new file mode 100644 index 000000000..89b8ad7d0 --- /dev/null +++ b/samples/usb/Makefile @@ -0,0 +1,5 @@ +XBE_TITLE = nxdk\ sample\ -\ usb +GEN_XISO = $(XBE_TITLE).iso +SRCS = $(CURDIR)/main.c +NXDK_DIR = $(CURDIR)/../.. +include $(NXDK_DIR)/Makefile diff --git a/samples/usb/main.c b/samples/usb/main.c new file mode 100644 index 000000000..f4c272dce --- /dev/null +++ b/samples/usb/main.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +/* + * This demo will initialise the usb stack, detect events on the usb ports + * and print the device PID and VID. +*/ +void device_connection_callback(UDEV_T *udev, int status) +{ + debugPrint("Device connected on USB hub port %u (VID: %04x PID: %04x)\n", udev->port_num, + udev->descriptor.idVendor, + udev->descriptor.idProduct); +} + +void device_disconnect_callback(UDEV_T *udev, int status) +{ + debugPrint("Device disconnected on USB hub port %u (VID: %04x PID: %04x)\n", udev->port_num, + udev->descriptor.idVendor, + udev->descriptor.idProduct); +} + +int main(void) +{ + XVideoSetMode(640, 480, 32, REFRESH_DEFAULT); + + usbh_core_init(); + usbh_install_conn_callback(&device_connection_callback, &device_disconnect_callback); + debugPrint("Plug and unplug USB devices to print the USB device VID and PID\n"); + + while (1) { + usbh_pooling_hubs(); + } + + //Never reached, but shown for clarity + usbh_core_deinit(); + return 0; +}