X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fstaging%2Frt2870%2Frt2870.h;h=5e5b3f2b7eb1e757975763c64409058ebf345015;hb=df36b439c5fedefe013d4449cb6a50d15e2f4d70;hp=a69cf338e49831db5b07cb43ea5c6c3da7b4d423;hpb=4d3383d0adb6d1047fb9ee3edd9dc05e4d2184f0;p=pandora-kernel.git diff --git a/drivers/staging/rt2870/rt2870.h b/drivers/staging/rt2870/rt2870.h index a69cf338e498..5e5b3f2b7eb1 100644 --- a/drivers/staging/rt2870/rt2870.h +++ b/drivers/staging/rt2870/rt2870.h @@ -33,7 +33,6 @@ /* rtmp_def.h */ // -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #define BULKAGGRE_ZISE 100 #define RT28XX_DRVDATA_SET(_a) usb_set_intfdata(_a, pAd); #define RT28XX_PUT_DEVICE usb_put_dev @@ -41,22 +40,15 @@ #define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb, GFP_ATOMIC) #define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr) #define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) -#else -#define BULKAGGRE_ZISE 60 -#define RT28XX_DRVDATA_SET(_a) -#define RT28XX_PUT_DEVICE(dev_p) -#define RTUSB_ALLOC_URB(iso) usb_alloc_urb(iso) -#define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb) -#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) kmalloc(BufSize, GFP_ATOMIC) -#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) kfree(pTransferBuf) -#endif #define RXBULKAGGRE_ZISE 12 #define MAX_TXBULK_LIMIT (LOCAL_TXBUF_SIZE*(BULKAGGRE_ZISE-1)) #define MAX_TXBULK_SIZE (LOCAL_TXBUF_SIZE*BULKAGGRE_ZISE) #define MAX_RXBULK_SIZE (LOCAL_TXBUF_SIZE*RXBULKAGGRE_ZISE) #define MAX_MLME_HANDLER_MEMORY 20 +#ifndef RT30xx #define RETRY_LIMIT 10 +#endif #define BUFFER_SIZE 2400 //2048 #define TX_RING 0xa #define PRIO_RING 0xc @@ -72,6 +64,9 @@ #define fRTUSB_BULK_OUT_DATA_NORMAL_2 0x00020000 #define fRTUSB_BULK_OUT_DATA_NORMAL_3 0x00040000 #define fRTUSB_BULK_OUT_DATA_NORMAL_4 0x00080000 +#ifdef RT30xx +#define fRTUSB_BULK_OUT_DATA_NORMAL_5 0x00100000 +#endif #define fRTUSB_BULK_OUT_PSPOLL 0x00000020 #define fRTUSB_BULK_OUT_DATA_FRAG 0x00000040 @@ -79,10 +74,7 @@ #define fRTUSB_BULK_OUT_DATA_FRAG_3 0x00000100 #define fRTUSB_BULK_OUT_DATA_FRAG_4 0x00000200 -#ifdef RALINK_ATE -#define fRTUSB_BULK_OUT_DATA_ATE 0x00100000 -#endif // RALINK_ATE // - +#ifndef RT30xx #define RT2870_USB_DEVICES \ { \ {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ \ @@ -148,6 +140,84 @@ {USB_DEVICE(0x7392,0x7717)}, /* Edimax */ \ { }/* Terminating entry */ \ } +#endif +#ifdef RT30xx +#define RT2870_USB_DEVICES \ +{ \ + {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ \ + {USB_DEVICE(0x148F,0x2870)}, /* Ralink */ \ + {USB_DEVICE(0x148F,0x3070)}, /* Ralink 3070 */ \ + {USB_DEVICE(0x148F,0x3071)}, /* Ralink 3071 */ \ + {USB_DEVICE(0x148F,0x3072)}, /* Ralink 3072 */ \ + {USB_DEVICE(0x0B05,0x1731)}, /* Asus */ \ + {USB_DEVICE(0x0B05,0x1732)}, /* Asus */ \ + {USB_DEVICE(0x0B05,0x1742)}, /* Asus */ \ + {USB_DEVICE(0x0DF6,0x0017)}, /* Sitecom */ \ + {USB_DEVICE(0x0DF6,0x002B)}, /* Sitecom */ \ + {USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */ \ + {USB_DEVICE(0x0DF6,0x003E)}, /* Sitecom 3070 */ \ + {USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */ \ + {USB_DEVICE(0x0DF6,0x0039)}, /* Sitecom 2770 */ \ + {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ \ + {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ \ + {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ \ + {USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ \ + {USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ \ + {USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ \ + {USB_DEVICE(0x2001,0x3C09)}, /* D-Link */ \ + {USB_DEVICE(0x2001,0x3C0A)}, /* D-Link 3072*/ \ + {USB_DEVICE(0x14B2,0x3C07)}, /* AL */ \ + {USB_DEVICE(0x14B2,0x3C12)}, /* AL 3070 */ \ + {USB_DEVICE(0x050D,0x8053)}, /* Belkin */ \ + {USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ \ + {USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ \ + {USB_DEVICE(0x07AA,0x002F)}, /* Corega */ \ + {USB_DEVICE(0x07AA,0x003C)}, /* Corega */ \ + {USB_DEVICE(0x07AA,0x003F)}, /* Corega */ \ + {USB_DEVICE(0x18C5,0x0012)}, /* Corega 3070 */ \ + {USB_DEVICE(0x1044,0x800B)}, /* Gigabyte */ \ + {USB_DEVICE(0x1044,0x800D)}, /* Gigabyte GN-WB32L 3070 */ \ + {USB_DEVICE(0x15A9,0x0006)}, /* Sparklan */ \ + {USB_DEVICE(0x083A,0xB522)}, /* SMC */ \ + {USB_DEVICE(0x083A,0xA618)}, /* SMC */ \ + {USB_DEVICE(0x083A,0x8522)}, /* Arcadyan */ \ + {USB_DEVICE(0x083A,0x7512)}, /* Arcadyan 2770 */ \ + {USB_DEVICE(0x083A,0x7522)}, /* Arcadyan */ \ + {USB_DEVICE(0x083A,0x7511)}, /* Arcadyan 3070 */ \ + {USB_DEVICE(0x0CDE,0x0022)}, /* ZCOM */ \ + {USB_DEVICE(0x0586,0x3416)}, /* Zyxel */ \ + {USB_DEVICE(0x0CDE,0x0025)}, /* Zyxel */ \ + {USB_DEVICE(0x1740,0x9701)}, /* EnGenius */ \ + {USB_DEVICE(0x1740,0x9702)}, /* EnGenius */ \ + {USB_DEVICE(0x1740,0x9703)}, /* EnGenius 3070 */ \ + {USB_DEVICE(0x0471,0x200f)}, /* Philips */ \ + {USB_DEVICE(0x14B2,0x3C25)}, /* Draytek */ \ + {USB_DEVICE(0x13D3,0x3247)}, /* AzureWave */ \ + {USB_DEVICE(0x13D3,0x3273)}, /* AzureWave 3070*/ \ + {USB_DEVICE(0x083A,0x6618)}, /* Accton */ \ + {USB_DEVICE(0x15c5,0x0008)}, /* Amit */ \ + {USB_DEVICE(0x0E66,0x0001)}, /* Hawking */ \ + {USB_DEVICE(0x0E66,0x0003)}, /* Hawking */ \ + {USB_DEVICE(0x129B,0x1828)}, /* Siemens */ \ + {USB_DEVICE(0x157E,0x300E)}, /* U-Media */ \ + {USB_DEVICE(0x050d,0x805c)}, \ + {USB_DEVICE(0x1482,0x3C09)}, /* Abocom*/ \ + {USB_DEVICE(0x14B2,0x3C09)}, /* Alpha */ \ + {USB_DEVICE(0x04E8,0x2018)}, /* samsung */ \ + {USB_DEVICE(0x07B8,0x3070)}, /* AboCom 3070 */ \ + {USB_DEVICE(0x07B8,0x3071)}, /* AboCom 3071 */ \ + {USB_DEVICE(0x07B8,0x3072)}, /* Abocom 3072 */ \ + {USB_DEVICE(0x7392,0x7711)}, /* Edimax 3070 */ \ + {USB_DEVICE(0x5A57,0x0280)}, /* Zinwell */ \ + {USB_DEVICE(0x5A57,0x0282)}, /* Zinwell */ \ + {USB_DEVICE(0x1A32,0x0304)}, /* Quanta 3070 */ \ + {USB_DEVICE(0x0789,0x0162)}, /* Logitec 2870 */ \ + {USB_DEVICE(0x0789,0x0163)}, /* Logitec 2870 */ \ + {USB_DEVICE(0x0789,0x0164)}, /* Logitec 2870 */ \ + {USB_DEVICE(0x1EDA,0x2310)}, /* AirTies 3070 */ \ + { }/* Terminating entry */ \ +} +#endif #define FREE_HTTX_RING(_p, _b, _t) \ { \ @@ -161,30 +231,6 @@ // // RXINFO appends at the end of each rx packet. // -#ifdef RT_BIG_ENDIAN -typedef struct PACKED _RXINFO_STRUC { - UINT32 PlcpSignal:12; - UINT32 LastAMSDU:1; - UINT32 CipherAlg:1; - UINT32 PlcpRssil:1; - UINT32 Decrypted:1; - UINT32 AMPDU:1; // To be moved - UINT32 L2PAD:1; - UINT32 RSSI:1; - UINT32 HTC:1; - UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header. - UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid - UINT32 Crc:1; // 1: CRC error - UINT32 MyBss:1; // 1: this frame belongs to the same BSSID - UINT32 Bcast:1; // 1: this is a broadcast frame - UINT32 Mcast:1; // 1: this is a multicast frame - UINT32 U2M:1; // 1: this RX frame is unicast to me - UINT32 FRAG:1; - UINT32 NULLDATA:1; - UINT32 DATA:1; - UINT32 BA:1; -} RXINFO_STRUC, *PRXINFO_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC; -#else typedef struct PACKED _RXINFO_STRUC { UINT32 BA:1; UINT32 DATA:1; @@ -207,25 +253,10 @@ typedef struct PACKED _RXINFO_STRUC { UINT32 LastAMSDU:1; UINT32 PlcpSignal:12; } RXINFO_STRUC, *PRXINFO_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC; -#endif - // // TXINFO // -#ifdef RT_BIG_ENDIAN -typedef struct _TXINFO_STRUC { - // Word 0 - UINT32 USBDMATxburst:1;//used ONLY in USB bulk Aggre. Force USB DMA transmit frame from current selected endpoint - UINT32 USBDMANextVLD:1; //used ONLY in USB bulk Aggregation, NextValid - UINT32 rsv2:2; // Software use. - UINT32 SwUseLastRound:1; // Software use. - UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA - UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition - UINT32 rsv:8; - UINT32 USBDMATxPktLen:16; //used ONLY in USB bulk Aggregation, Total byte counts of all sub-frame. -} TXINFO_STRUC, *PTXINFO_STRUC; -#else typedef struct _TXINFO_STRUC { // Word 0 UINT32 USBDMATxPktLen:16; //used ONLY in USB bulk Aggregation, Total byte counts of all sub-frame. @@ -237,7 +268,6 @@ typedef struct _TXINFO_STRUC { UINT32 USBDMANextVLD:1; //used ONLY in USB bulk Aggregation, NextValid UINT32 USBDMATxburst:1;//used ONLY in USB bulk Aggre. Force USB DMA transmit frame from current selected endpoint } TXINFO_STRUC, *PTXINFO_STRUC; -#endif #define TXINFO_SIZE 4 #define RXINFO_SIZE 4 @@ -254,6 +284,23 @@ typedef struct _MGMT_STRUC { /* ----------------- EEPROM Related MACRO ----------------- */ +#ifdef RT30xx +#define RT28xx_EEPROM_READ16(pAd, offset, var) \ + do { \ + RTUSBReadEEPROM(pAd, offset, (PUCHAR)&(var), 2); \ + if(!pAd->bUseEfuse) \ + var = le2cpu16(var); \ + }while(0) + +#define RT28xx_EEPROM_WRITE16(pAd, offset, var) \ + do{ \ + USHORT _tmpVar=var; \ + if(!pAd->bUseEfuse) \ + _tmpVar = cpu2le16(var); \ + RTUSBWriteEEPROM(pAd, offset, (PUCHAR)&(_tmpVar), 2); \ + }while(0) +#endif // RT30xx // +#ifndef RT30xx #define RT28xx_EEPROM_READ16(pAd, offset, var) \ do { \ RTUSBReadEEPROM(pAd, offset, (PUCHAR)&(var), 2); \ @@ -266,6 +313,7 @@ typedef struct _MGMT_STRUC { _tmpVar = cpu2le16(var); \ RTUSBWriteEEPROM(pAd, offset, (PUCHAR)&(_tmpVar), 2); \ }while(0) +#endif // RT30xx // /* ----------------- TASK/THREAD Related MACRO ----------------- */ #define RT28XX_TASK_THREAD_INIT(pAd, Status) \ @@ -273,19 +321,8 @@ typedef struct _MGMT_STRUC { /* ----------------- Frimware Related MACRO ----------------- */ -#if 0 -#define RT28XX_FIRMUD_INIT(pAd) \ - { UINT32 MacReg; \ - RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); } - -#define RT28XX_FIRMUD_END(pAd) \ - RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff); \ - RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff); \ - RTUSBFirmwareRun(pAd); -#else #define RT28XX_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \ RTUSBFirmwareWrite(_pAd, _pFwImage, _FwLen) -#endif /* ----------------- TX Related MACRO ----------------- */ #define RT28XX_START_DEQUEUE(pAd, QueIdx, irqFlags) \ @@ -370,13 +407,6 @@ extern UCHAR EpToQueue[6]; /* ----------------- RX Related MACRO ----------------- */ //#define RT28XX_RX_ERROR_CHECK RTMPCheckRxWI -#if 0 -#define RT28XX_RCV_INIT(pAd) \ - pAd->TransferBufferLength = 0; \ - pAd->ReadPosition = 0; \ - pAd->pCurrRxContext = NULL; -#endif - #define RT28XX_RV_ALL_BUF_END(bBulkReceive) \ /* We return STATUS_MORE_PROCESSING_REQUIRED so that the completion */ \ /* routine (IofCompleteRequest) will stop working on the irp. */ \ @@ -384,27 +414,6 @@ extern UCHAR EpToQueue[6]; /* ----------------- ASIC Related MACRO ----------------- */ -#if 0 -#define RT28XX_DMA_WRITE_INIT(GloCfg) \ - { GloCfg.field.EnTXWriteBackDDONE = 1; \ - GloCfg.field.EnableRxDMA = 1; \ - GloCfg.field.EnableTxDMA = 1; } - -#define RT28XX_DMA_POST_WRITE(_pAd) \ - do{ USB_DMA_CFG_STRUC UsbCfg; \ - UsbCfg.word = 0; \ - /* for last packet, PBF might use more than limited, so minus 2 to prevent from error */ \ - UsbCfg.field.RxBulkAggLmt = (MAX_RXBULK_SIZE /1024)-3; \ - UsbCfg.field.phyclear = 0; \ - /* usb version is 1.1,do not use bulk in aggregation */ \ - if (_pAd->BulkInMaxPacketSize == 512) \ - UsbCfg.field.RxBulkAggEn = 1; \ - UsbCfg.field.RxBulkEn = 1; \ - UsbCfg.field.TxBulkEn = 1; \ - UsbCfg.field.RxBulkAggTOut = 0x80; /* 2006-10-18 */ \ - RTUSBWriteMACRegister(_pAd, USB_DMA_CFG, UsbCfg.word); \ - }while(0) -#endif // reset MAC of a station entry to 0xFFFFFFFFFFFF #define RT28XX_STA_ENTRY_MAC_RESET(pAd, Wcid) \ @@ -420,6 +429,14 @@ extern UCHAR EpToQueue[6]; RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_CLIENT_MAC_ENTRY, \ pEntry, sizeof(MAC_TABLE_ENTRY)); +#ifdef RT30xx +// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet +// Set MAC register value according operation mode +#define RT28XX_UPDATE_PROTECT(pAd) \ + RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_UPDATE_PROTECT, NULL, 0); +// end johnli +#endif + // remove Pair-wise key material from ASIC // yet implement #define RT28XX_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid) @@ -507,8 +524,10 @@ extern UCHAR EpToQueue[6]; #define RT28xx_CHIP_NAME "RT2870" #define USB_CYC_CFG 0x02a4 +#ifndef RT30xx #define STATUS_SUCCESS 0x00 #define STATUS_UNSUCCESSFUL 0x01 +#endif #define NT_SUCCESS(status) (((status) > 0) ? (1):(0)) #define InterlockedIncrement atomic_inc #define NdisInterlockedIncrement atomic_inc @@ -533,7 +552,9 @@ extern UCHAR EpToQueue[6]; //#undef MlmeAllocateMemory //#undef MlmeFreeMemory +#ifndef RT30xx typedef int NTSTATUS; +#endif typedef struct usb_device * PUSB_DEV; /* MACRO for linux usb */ @@ -551,23 +572,9 @@ typedef struct usb_ctrlrequest devctrlrequest; #define UNLINK_TIMEOUT_MS 3 /* unlink urb */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7) #define RTUSB_UNLINK_URB(pUrb) usb_kill_urb(pUrb) -#else -#define RTUSB_UNLINK_URB(pUrb) usb_unlink_urb(pUrb) -#endif // Prototypes of completion funuc. -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -#define RTUSBBulkOutDataPacketComplete(purb, pt_regs) RTUSBBulkOutDataPacketComplete(purb) -#define RTUSBBulkOutMLMEPacketComplete(pUrb, pt_regs) RTUSBBulkOutMLMEPacketComplete(pUrb) -#define RTUSBBulkOutNullFrameComplete(pUrb, pt_regs) RTUSBBulkOutNullFrameComplete(pUrb) -#define RTUSBBulkOutRTSFrameComplete(pUrb, pt_regs) RTUSBBulkOutRTSFrameComplete(pUrb) -#define RTUSBBulkOutPsPollComplete(pUrb, pt_regs) RTUSBBulkOutPsPollComplete(pUrb) -#define RTUSBBulkRxComplete(pUrb, pt_regs) RTUSBBulkRxComplete(pUrb) -#endif - - VOID RTUSBBulkOutDataPacketComplete(purbb_t purb, struct pt_regs *pt_regs); VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs); VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs); @@ -575,7 +582,7 @@ VOID RTUSBBulkOutRTSFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs); VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs *pt_regs); VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs); - +#ifndef RT30xx #define RTUSBMlmeUp(pAd) \ { \ POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ @@ -591,7 +598,22 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs); CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) \ up(&(pAd->RTUSBCmd_semaphore)); \ } +#endif +#ifdef RT30xx +#define RTUSBMlmeUp(pAd) \ +{ \ + POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ + if(pObj->MLMEThr_pid>0) \ + up(&(pAd->mlme_semaphore)); \ +} +#define RTUSBCMDUp(pAd) \ +{ \ + POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ + if(pObj->RTUSBCmdThr_pid>0) \ + up(&(pAd->RTUSBCmd_semaphore)); \ +} +#endif static inline NDIS_STATUS RTMPAllocateMemory( OUT PVOID *ptr, @@ -633,7 +655,9 @@ typedef struct _RT_SET_ASIC_WCID { ULONG WCID; // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based ULONG SetTid; // time-based: seconds, packet-based: kilo-packets ULONG DeleteTid; // time-based: seconds, packet-based: kilo-packets +#ifndef RT30xx UCHAR Addr[MAC_ADDR_LEN]; // avoid in interrupt when write key +#endif } RT_SET_ASIC_WCID,*PRT_SET_ASIC_WCID; typedef struct _RT_SET_ASIC_WCID_ATTRI { @@ -676,13 +700,6 @@ typedef struct _CmdQ { UINT32 CmdQState; }CmdQ, *PCmdQ; -// -// For WPA SUPPLICANT: WIRELESS EXT support wireless events: v14 or newer -// -#if WIRELESS_EXT >= 14 -//#define WPA_SUPPLICANT_SUPPORT 1 -#endif - /* oid.h */ // Cipher suite type for mixed mode group cipher, P802.11i-2004 typedef enum _RT_802_11_CIPHER_SUITE_TYPE { @@ -742,6 +759,11 @@ typedef struct _CMDHandler_TLV { #define CMDTHREAD_802_11_SET_PREAMBLE 0x0D790101 // cmd #define CMDTHREAD_802_11_COUNTER_MEASURE 0x0D790102 // cmd +#ifdef RT30xx +// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet +#define CMDTHREAD_UPDATE_PROTECT 0x0D790103 // cmd +// end johnli +#endif #define WPA1AKMBIT 0x01 #define WPA2AKMBIT 0x02