Changes in / [5da18c7:a2a3763] in mainline


Ignore:
Location:
uspace
Files:
1 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/mkbd/main.c

    r5da18c7 ra2a3763  
    7171                usb_hid_free_report(*report);
    7272                *report = NULL;
    73                 //printf("usb_hid_report_init() failed.\n");
     73                printf("usb_hid_report_init() failed.\n");
    7474                return rc;
    7575        }
     
    8282                usb_hid_free_report(*report);
    8383                *report = NULL;
    84                 //printf("usbhid_dev_get_report_descriptor_length() failed.\n");
     84                printf("usbhid_dev_get_report_descriptor_length() failed.\n");
    8585                return rc;
    8686        }
     
    8989                usb_hid_free_report(*report);
    9090                *report = NULL;
    91                 //printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");
     91                printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");
    9292                return EINVAL;  // TODO: other error code?
    9393        }
     
    108108                *report = NULL;
    109109                free(desc);
    110                 //printf("usbhid_dev_get_report_descriptor() failed.\n");
     110                printf("usbhid_dev_get_report_descriptor() failed.\n");
    111111                return rc;
    112112        }
     
    116116                *report = NULL;
    117117                free(desc);
    118 //              printf("usbhid_dev_get_report_descriptor() returned wrong size:"
    119 //                  " %zu, expected: %zu.\n", actual_size, report_desc_size);
     118                printf("usbhid_dev_get_report_descriptor() returned wrong size:"
     119                    " %zu, expected: %zu.\n", actual_size, report_desc_size);
    120120                return EINVAL;  // TODO: other error code?
    121121        }
     
    128128        if (rc != EOK) {
    129129                free(desc);
    130 //              printf("usb_hid_parse_report_descriptor() failed.\n");
     130                printf("usb_hid_parse_report_descriptor() failed.\n");
    131131                return rc;
    132132        }
     
    213213       
    214214        char *devpath = argv[1];
     215        //const char *devpath = "/hw/pci0/00:06.0/ohci-rh/usb00_a2/HID1/hid";
     216       
     217        int rc;
    215218       
    216219        devman_handle_t dev_handle = 0;
    217        
    218         int rc = usb_resolve_device_handle(devpath, NULL, NULL, &dev_handle);
    219         if (rc != EOK) {
    220                 printf("Device not found or not of USB kind: %s.\n",
     220        rc = devman_device_get_handle(devpath, &dev_handle, 0);
     221        if (rc != EOK) {
     222                printf("Failed to get handle from devman: %s.\n",
    221223                    str_error(rc));
    222224                return rc;
  • uspace/drv/ehci-hcd/main.c

    r5da18c7 ra2a3763  
    7575}
    7676
    77         uintptr_t reg_base = 0;
    78         size_t reg_size = 0;
     77        uintptr_t mem_reg_base = 0;
     78        size_t mem_reg_size = 0;
    7979        int irq = 0;
    8080
    81         int ret = pci_get_my_registers(device, &reg_base, &reg_size, &irq);
     81        int ret =
     82            pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq);
    8283        CHECK_RET_RETURN(ret,
    8384            "Failed to get memory addresses for %" PRIun ": %s.\n",
    8485            device->handle, str_error(ret));
    8586        usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
    86             reg_base, reg_size, irq);
     87            mem_reg_base, mem_reg_size, irq);
    8788
    88         ret = pci_disable_legacy(device, reg_base, reg_size, irq);
     89        ret = pci_disable_legacy(device);
    8990        CHECK_RET_RETURN(ret,
    9091            "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret));
  • uspace/drv/ehci-hcd/pci.c

    r5da18c7 ra2a3763  
    5555#define CMD_OFFSET 0x0
    5656#define STS_OFFSET 0x4
    57 #define INT_OFFSET 0x8
    5857#define CFG_OFFSET 0x40
    5958
    6059#define USBCMD_RUN 1
    61 #define USBSTS_HALTED (1 << 12)
    6260
    6361#define USBLEGSUP_OFFSET 0
     
    6664#define USBLEGCTLSTS_OFFSET 4
    6765
    68 #define DEFAULT_WAIT 1000
     66#define DEFAULT_WAIT 10000
    6967#define WAIT_STEP 10
    70 
    71 #define PCI_READ(size) \
    72 do { \
    73         const int parent_phone = \
    74             devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
    75         if (parent_phone < 0) {\
    76                 return parent_phone; \
    77         } \
    78         sysarg_t add = (sysarg_t)address; \
    79         sysarg_t val; \
    80         const int ret = \
    81             async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
    82                 IPC_M_CONFIG_SPACE_READ_##size, add, &val); \
    83         assert(value); \
    84         *value = val; \
    85         async_hangup(parent_phone); \
    86         return ret; \
    87 } while(0)
    88 
    89 static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)
    90 {
    91         PCI_READ(32);
    92 }
    93 static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)
    94 {
    95         PCI_READ(16);
    96 }
    97 static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)
    98 {
    99         PCI_READ(8);
    100 }
    101 #define PCI_WRITE(size) \
    102 do { \
    103         const int parent_phone = \
    104             devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
    105         if (parent_phone < 0) {\
    106                 return parent_phone; \
    107         } \
    108         sysarg_t add = (sysarg_t)address; \
    109         sysarg_t val = value; \
    110         const int ret = \
    111             async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
    112                 IPC_M_CONFIG_SPACE_WRITE_##size, add, val); \
    113         async_hangup(parent_phone); \
    114         return ret; \
    115 } while(0)
    116 
    117 static int pci_write32(const ddf_dev_t *dev, int address, uint32_t value)
    118 {
    119         PCI_WRITE(32);
    120 }
    121 static int pci_write16(const ddf_dev_t *dev, int address, uint16_t value)
    122 {
    123         PCI_WRITE(16);
    124 }
    125 static int pci_write8(const ddf_dev_t *dev, int address, uint8_t value)
    126 {
    127         PCI_WRITE(8);
    128 }
    12968
    13069/** Get address of registers and IRQ for given device.
     
    13675 * @return Error code.
    13776 */
    138 int pci_get_my_registers(const ddf_dev_t *dev,
     77int pci_get_my_registers(ddf_dev_t *dev,
    13978    uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no)
    14079{
    14180        assert(dev != NULL);
    14281
    143         const int parent_phone =
    144             devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);
     82        int parent_phone = devman_parent_device_connect(dev->handle,
     83            IPC_FLAG_BLOCKING);
    14584        if (parent_phone < 0) {
    14685                return parent_phone;
     
    206145 * @return Error code.
    207146 */
    208 int pci_enable_interrupts(const ddf_dev_t *device)
     147int pci_enable_interrupts(ddf_dev_t *device)
    209148{
    210         const int parent_phone =
     149        int parent_phone =
    211150            devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
    212151        if (parent_phone < 0) {
    213152                return parent_phone;
    214153        }
    215         const bool enabled = hw_res_enable_interrupt(parent_phone);
     154        bool enabled = hw_res_enable_interrupt(parent_phone);
    216155        async_hangup(parent_phone);
    217156        return enabled ? EOK : EIO;
     
    223162 * @return Error code.
    224163 */
    225 int pci_disable_legacy(
    226     const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, int irq)
     164int pci_disable_legacy(ddf_dev_t *device)
    227165{
    228166        assert(device);
    229         (void) pci_read16;
    230         (void) pci_read8;
    231         (void) pci_write16;
    232 
    233 #define CHECK_RET_RETURN(ret, message...) \
     167        int parent_phone = devman_parent_device_connect(device->handle,
     168                IPC_FLAG_BLOCKING);
     169        if (parent_phone < 0) {
     170                return parent_phone;
     171        }
     172
     173#define CHECK_RET_HANGUP_RETURN(ret, message...) \
    234174        if (ret != EOK) { \
    235175                usb_log_error(message); \
     176                async_hangup(parent_phone); \
    236177                return ret; \
    237178        } else (void)0
    238179
    239         /* Map EHCI registers */
    240         void *regs = NULL;
    241         int ret = pio_enable((void*)reg_base, reg_size, &regs);
    242         CHECK_RET_RETURN(ret, "Failed(%d) to map registers %p.\n",
    243             ret, (void *) reg_base);
     180
     181        /* read register space BASE BAR */
     182        sysarg_t address = 0x10;
     183        sysarg_t value;
     184
     185        int ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     186            IPC_M_CONFIG_SPACE_READ_32, address, &value);
     187        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read PCI config space.\n",
     188            ret);
     189        usb_log_info("Register space BAR at %p:%" PRIxn ".\n",
     190            (void *) address, value);
     191
     192        /* clear lower byte, it's not part of the BASE address */
     193        uintptr_t registers = (value & 0xffffff00);
     194        usb_log_info("Memory registers BASE address:%p.\n", (void *) registers);
     195
     196        /* if nothing setup the hc, we don't need to turn it off */
     197        if (registers == 0)
     198                return ENOTSUP;
     199
     200        /* map EHCI registers */
     201        void *regs = as_get_mappable_page(4096);
     202        ret = physmem_map((void*)(registers & PAGE_SIZE_MASK), regs, 1,
     203            AS_AREA_READ | AS_AREA_WRITE);
     204        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to map registers %p:%p.\n",
     205            ret, regs, (void *) registers);
     206
     207        /* calculate value of BASE */
     208        registers = (registers & 0xf00) | (uintptr_t)regs;
    244209
    245210        const uint32_t hcc_params =
    246             *(uint32_t*)(regs + HCC_PARAMS_OFFSET);
     211            *(uint32_t*)(registers + HCC_PARAMS_OFFSET);
    247212        usb_log_debug("Value of hcc params register: %x.\n", hcc_params);
    248213
    249214        /* Read value of EHCI Extended Capabilities Pointer
    250          * position of EEC registers (points to PCI config space) */
    251         const uint32_t eecp =
     215         * (points to PCI config space) */
     216        uint32_t eecp =
    252217            (hcc_params >> HCC_PARAMS_EECP_OFFSET) & HCC_PARAMS_EECP_MASK;
    253218        usb_log_debug("Value of EECP: %x.\n", eecp);
    254219
     220        /* Read the second EEC. i.e. Legacy Support and Control register */
     221        /* TODO: Check capability type here */
     222        ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     223            IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGCTLSTS_OFFSET, &value);
     224        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGCTLSTS.\n", ret);
     225        usb_log_debug("USBLEGCTLSTS: %" PRIxn ".\n", value);
     226
    255227        /* Read the first EEC. i.e. Legacy Support register */
    256         uint32_t usblegsup;
    257         ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
    258         CHECK_RET_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
    259         usb_log_debug("USBLEGSUP: %" PRIxn ".\n", usblegsup);
     228        /* TODO: Check capability type here */
     229        ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     230            IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
     231        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
     232        usb_log_debug2("USBLEGSUP: %" PRIxn ".\n", value);
    260233
    261234        /* Request control from firmware/BIOS, by writing 1 to highest byte.
    262235         * (OS Control semaphore)*/
    263         usb_log_debug("Requesting OS control.\n");
    264         ret = pci_write8(device, eecp + USBLEGSUP_OFFSET + 3, 1);
    265         CHECK_RET_RETURN(ret, "Failed(%d) to request OS EHCI control.\n", ret);
     236        ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     237           IPC_M_CONFIG_SPACE_WRITE_8, eecp + USBLEGSUP_OFFSET + 3, 1);
     238        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to request OS EHCI control.\n",
     239            ret);
    266240
    267241        size_t wait = 0;
    268242        /* Wait for BIOS to release control. */
    269         ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
    270         while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) {
     243        while ((wait < DEFAULT_WAIT) && (value & USBLEGSUP_BIOS_CONTROL)) {
    271244                async_usleep(WAIT_STEP);
    272                 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
     245                ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     246                    IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
    273247                wait += WAIT_STEP;
    274248        }
    275249
    276250
    277         if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) {
     251        if ((value & USBLEGSUP_BIOS_CONTROL) == 0) {
    278252                usb_log_info("BIOS released control after %zu usec.\n", wait);
    279253        } else {
     
    281255                usb_log_warning( "BIOS failed to release control after "
    282256                    "%zu usecs, force it.\n", wait);
    283                 ret = pci_write32(device, eecp + USBLEGSUP_OFFSET,
     257                ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     258                    IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGSUP_OFFSET,
    284259                    USBLEGSUP_OS_CONTROL);
    285                 CHECK_RET_RETURN(ret, "Failed(%d) to force OS control.\n", ret);
    286                 /* Check capability type here, A value of 01h
    287                  * identifies the capability as Legacy Support.
    288                  * This extended capability requires one
    289                  * additional 32-bit register for control/status information,
    290                  * and this register is located at offset EECP+04h
    291                  * */
    292                 if ((usblegsup & 0xff) == 1) {
    293                         /* Read the second EEC
    294                          * Legacy Support and Control register */
    295                         uint32_t usblegctlsts;
    296                         ret = pci_read32(
    297                             device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
    298                         CHECK_RET_RETURN(ret,
    299                             "Failed(%d) to get USBLEGCTLSTS.\n", ret);
    300                         usb_log_debug("USBLEGCTLSTS: %" PRIxn ".\n",
    301                             usblegctlsts);
    302                         /* Zero SMI enables in legacy control register.
    303                          * It should prevent pre-OS code from interfering. */
    304                         ret = pci_write32(device, eecp + USBLEGCTLSTS_OFFSET,
    305                             0xe0000000); /* three upper bits are WC */
    306                         CHECK_RET_RETURN(ret,
    307                             "Failed(%d) zero USBLEGCTLSTS.\n", ret);
    308                         udelay(10);
    309                         ret = pci_read32(
    310                             device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
    311                         CHECK_RET_RETURN(ret,
    312                             "Failed(%d) to get USBLEGCTLSTS 2.\n", ret);
    313                         usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIxn ".\n",
    314                             usblegctlsts);
    315                 }
    316         }
    317 
     260                CHECK_RET_HANGUP_RETURN(ret,
     261                    "Failed(%d) to force OS EHCI control.\n", ret);
     262        }
     263
     264        /* Zero SMI enables in legacy control register.
     265         * It would prevent pre-OS code from interfering. */
     266        ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     267           IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGCTLSTS_OFFSET,
     268           0xe0000000);
     269        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret);
     270
     271        /* Read again Legacy Support and Control register */
     272        ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     273            IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGCTLSTS_OFFSET, &value);
     274        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGCTLSTS.\n", ret);
     275        usb_log_debug2("USBLEGCTLSTS: %" PRIxn ".\n", value);
    318276
    319277        /* Read again Legacy Support register */
    320         ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
    321         CHECK_RET_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
    322         usb_log_debug("USBLEGSUP: %" PRIxn ".\n", usblegsup);
     278        ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
     279            IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
     280        CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
     281        usb_log_debug2("USBLEGSUP: %" PRIxn ".\n", value);
    323282
    324283        /*
     
    327286
    328287        /* Get size of capability registers in memory space. */
    329         const unsigned operation_offset = *(uint8_t*)regs;
     288        uint8_t operation_offset = *(uint8_t*)registers;
    330289        usb_log_debug("USBCMD offset: %d.\n", operation_offset);
    331290
    332291        /* Zero USBCMD register. */
    333292        volatile uint32_t *usbcmd =
    334             (uint32_t*)((uint8_t*)regs + operation_offset + CMD_OFFSET);
     293            (uint32_t*)((uint8_t*)registers + operation_offset + CMD_OFFSET);
    335294        volatile uint32_t *usbsts =
    336             (uint32_t*)((uint8_t*)regs + operation_offset + STS_OFFSET);
    337         volatile uint32_t *usbconf =
    338             (uint32_t*)((uint8_t*)regs + operation_offset + CFG_OFFSET);
    339         volatile uint32_t *usbint =
    340             (uint32_t*)((uint8_t*)regs + operation_offset + INT_OFFSET);
     295            (uint32_t*)((uint8_t*)registers + operation_offset + STS_OFFSET);
     296        volatile uint32_t *usbconfigured =
     297            (uint32_t*)((uint8_t*)registers + operation_offset + CFG_OFFSET);
    341298        usb_log_debug("USBCMD value: %x.\n", *usbcmd);
    342299        if (*usbcmd & USBCMD_RUN) {
    343                 *usbsts = 0x3f; /* ack all interrupts */
    344                 *usbint = 0; /* disable all interrutps */
    345                 *usbconf = 0; /* relase control of RH ports */
    346 
    347300                *usbcmd = 0;
    348                 /* Wait until hc is halted */
    349                 while ((*usbsts & USBSTS_HALTED) == 0);
     301                while (!(*usbsts & (1 << 12))); /*wait until hc is halted */
     302                *usbconfigured = 0;
    350303                usb_log_info("EHCI turned off.\n");
    351304        } else {
    352305                usb_log_info("EHCI was not running.\n");
    353306        }
    354         usb_log_debug("Registers: \n"
    355             "\t USBCMD: %x(0x00080000 = at least 1ms between interrupts)\n"
    356             "\t USBSTS: %x(0x00001000 = HC halted)\n"
    357             "\t USBINT: %x(0x0 = no interrupts).\n"
    358             "\t CONFIG: %x(0x0 = ports controlled by companion hc).\n",
    359             *usbcmd, *usbsts, *usbint, *usbconf);
    360 
     307        usb_log_debug("Registers: %x(0x00080000):%x(0x00001000):%x(0x0).\n",
     308            *usbcmd, *usbsts, *usbconfigured);
     309
     310        async_hangup(parent_phone);
    361311        return ret;
    362 #undef CHECK_RET_RETURN
     312#undef CHECK_RET_HANGUP_RETURN
    363313}
    364314/*----------------------------------------------------------------------------*/
  • uspace/drv/ehci-hcd/pci.h

    r5da18c7 ra2a3763  
    3838#include <ddf/driver.h>
    3939
    40 int pci_get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *);
    41 int pci_enable_interrupts(const ddf_dev_t *);
    42 int pci_disable_legacy(const ddf_dev_t *, uintptr_t, size_t, int);
     40int pci_get_my_registers(ddf_dev_t *, uintptr_t *, size_t *, int *);
     41int pci_enable_interrupts(ddf_dev_t *);
     42int pci_disable_legacy(ddf_dev_t *);
    4343
    4444#endif
  • uspace/drv/ohci/root_hub.c

    r5da18c7 ra2a3763  
    5757        .device_version = 0,
    5858        .length = sizeof (usb_standard_device_descriptor_t),
     59        /// \TODO this value is guessed
    5960        .max_packet_size = 8,
    6061        .vendor_id = 0x16db,
     
    116117 */
    117118static const uint32_t hub_clear_feature_by_writing_one_mask =
    118     RHS_CLEAR_PORT_POWER;
     119   RHS_CLEAR_PORT_POWER;
    119120
    120121/**
     
    411412        request->transfered_size = 4;
    412413        uint32_t data = instance->registers->rh_port_status[port - 1];
    413         memcpy(request->data_buffer, &data, 4);
     414        memcpy(request->data_buffer,&data,4);
    414415#if 0
    415416        int i;
     
    444445        uint32_t data = mask & instance->registers->rh_status;
    445446        //uint32_buffer[0] = mask & instance->registers->rh_status;
    446         memcpy(request->data_buffer, &data, 4);
     447        memcpy(request->data_buffer,&data,4);
    447448
    448449        return EOK;
     
    467468
    468469        usb_hub_bm_request_type_t request_type = request_packet->request_type;
    469         if (buffer_size < 4) {
     470        if (buffer_size < 4/*request_packet->length*/) {///\TODO
    470471                usb_log_warning("requested more data than buffer size\n");
    471472                return EINVAL;
     
    498499            | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16));
    499500        bzero(bitmap, instance->interrupt_mask_size);
    500         if ((instance->registers->rh_status & mask) != 0) {
     501        if ((instance->registers->rh_status & mask) !=0 ) {
    501502                bitmap[0] = 1;
    502503        }
     
    677678            (instance->registers->rh_port_status[port - 1] | (1 << feature))
    678679            & (~port_clear_feature_valid_mask);
     680        /// \TODO any error?
     681
    679682        return EOK;
    680683}
     
    704707            & (~port_clear_feature_valid_mask))
    705708            | (1 << feature);
     709        /// \TODO any error?
    706710
    707711        return EOK;
     
    921925 * @return
    922926 */
    923 static int process_interrupt_mask_in_instance(rh_t *instance,
    924     usb_transfer_batch_t * request) {
     927static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) {
    925928        memcpy(request->data_buffer, instance->interrupt_buffer,
    926929            instance->interrupt_mask_size);
     
    942945 * @return
    943946 */
    944 static bool is_zeros(void *buffer, size_t size) {
     947static bool is_zeros(void * buffer, size_t size) {
    945948        if (!buffer) return true;
    946949        if (!size) return true;
  • uspace/drv/uhci-rhd/port.h

    r5da18c7 ra2a3763  
    5555
    5656/** UHCI port structure */
    57 typedef struct uhci_port {
     57typedef struct uhci_port
     58{
    5859        const char *id_string;
    5960        port_status_t *address;
     
    6768
    6869int uhci_port_init(
    69     uhci_port_t *port, port_status_t *address, unsigned number,
    70     unsigned usec, ddf_dev_t *rh);
     70  uhci_port_t *port, port_status_t *address, unsigned number,
     71  unsigned usec, ddf_dev_t *rh);
    7172
    7273void uhci_port_fini(uhci_port_t *port);
  • uspace/drv/usbhid/usbhid.c

    r5da18c7 ra2a3763  
    7878        }
    7979       
    80         assert(hid_dev->subdriver_count >= 0);
    81        
    8280        // set the init callback
    83         hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_kbd_init;
     81        hid_dev->subdrivers[0].init = usb_kbd_init;
    8482       
    8583        // set the polling callback
    86         hid_dev->subdrivers[hid_dev->subdriver_count].poll =
    87             usb_kbd_polling_callback;
     84        hid_dev->subdrivers[0].poll = usb_kbd_polling_callback;
    8885       
    8986        // set the polling ended callback
    90         hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
     87        hid_dev->subdrivers[0].poll_end = NULL;
    9188       
    9289        // set the deinit callback
    93         hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_kbd_deinit;
     90        hid_dev->subdrivers[0].deinit = usb_kbd_deinit;
    9491       
    9592        // set subdriver count
    96         ++hid_dev->subdriver_count;
     93        hid_dev->subdriver_count = 1;
    9794       
    9895        return EOK;
     
    111108        }
    112109       
    113         assert(hid_dev->subdriver_count >= 0);
    114        
    115110        // set the init callback
    116         hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_mouse_init;
     111        hid_dev->subdrivers[0].init = usb_mouse_init;
    117112       
    118113        // set the polling callback
    119         hid_dev->subdrivers[hid_dev->subdriver_count].poll =
    120             usb_mouse_polling_callback;
     114        hid_dev->subdrivers[0].poll = usb_mouse_polling_callback;
    121115       
    122116        // set the polling ended callback
    123         hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
     117        hid_dev->subdrivers[0].poll_end = NULL;
    124118       
    125119        // set the deinit callback
    126         hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_mouse_deinit;
     120        hid_dev->subdrivers[0].deinit = usb_mouse_deinit;
    127121       
    128122        // set subdriver count
    129         ++hid_dev->subdriver_count;
     123        hid_dev->subdriver_count = 1;
    130124       
    131125        return EOK;
     
    144138        }
    145139       
    146         assert(hid_dev->subdriver_count >= 0);
    147        
    148140        // set the init callback
    149         hid_dev->subdrivers[hid_dev->subdriver_count].init =
    150             usb_generic_hid_init;
     141        hid_dev->subdrivers[0].init = usb_generic_hid_init;
    151142       
    152143        // set the polling callback
    153         hid_dev->subdrivers[hid_dev->subdriver_count].poll =
    154             usb_generic_hid_polling_callback;
     144        hid_dev->subdrivers[0].poll = usb_generic_hid_polling_callback;
    155145       
    156146        // set the polling ended callback
    157         hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
     147        hid_dev->subdrivers[0].poll_end = NULL;
    158148       
    159149        // set the deinit callback
    160         hid_dev->subdrivers[hid_dev->subdriver_count].deinit = NULL;
     150        hid_dev->subdrivers[0].deinit = NULL;
    161151       
    162152        // set subdriver count
    163         ++hid_dev->subdriver_count;
     153        hid_dev->subdriver_count = 1;
    164154       
    165155        return EOK;
     
    206196        }
    207197       
    208 //      if (mapping->report_id >= 0) {
    209 //              usb_hid_report_path_set_report_id(usage_path,
    210 //                  mapping->report_id);
    211 //      }
     198        if (mapping->report_id >= 0) {
     199                usb_hid_report_path_set_report_id(usage_path,
     200                    mapping->report_id);
     201        }
    212202       
    213203        assert(hid_dev->report != NULL);
     
    216206//      size_t size = usb_hid_report_size(hid_dev->report, 0,
    217207//          USB_HID_REPORT_TYPE_INPUT);
    218 //      size_t size = 0;
    219        
    220         bool matches = false;
    221 
    222 //      usb_hid_report_description_t *report_des =
    223 //              usb_hid_report_find_description(hid_dev->report,
    224 //              mapping->report_id, USB_HID_REPORT_TYPE_INPUT);
    225         uint8_t report_id = mapping->report_id;
    226 
    227         /*while(report_des != NULL)*/do {
    228 
    229 //              if((mapping->report_id) == 0 && (report_des->report_id != 0)) {
    230 //                      usb_hid_report_path_set_report_id(usage_path,
    231 //                              report_des->report_id);
    232 //              }
    233                                              
    234                 usb_log_debug("Trying report id %u\n", report_id);
    235                
    236                 if (report_id != 0) {
    237                         usb_hid_report_path_set_report_id(usage_path,
    238                                 report_id);
    239                 }
    240 
    241                 usb_hid_report_field_t *field = usb_hid_report_get_sibling(
    242                     hid_dev->report,
    243                     NULL, usage_path, mapping->compare,
    244                     USB_HID_REPORT_TYPE_INPUT);
    245                
    246                 usb_log_debug("Field: %p\n", field);
    247 
    248                 if (field != NULL) {
    249 //                      size++;
    250 //                      field = usb_hid_report_get_sibling(hid_dev->report,
    251 //                          field, usage_path, mapping->compare,
    252 //                          USB_HID_REPORT_TYPE_INPUT);
    253                         matches = true;
    254                         break;
    255                 }
    256                
    257                 report_id = usb_hid_get_next_report_id(
    258                     hid_dev->report, report_id,
    259                     USB_HID_REPORT_TYPE_INPUT);
    260 
    261 //              if((mapping->report_id == 0) && (report_des->report_id != 0)) {
    262 //                      uint8_t report_id = usb_hid_get_next_report_id(
    263 //                              hid_dev->report, report_des->report_id,
    264 //                              USB_HID_REPORT_TYPE_INPUT);
    265 
    266 //                      if(report_id == 0) {
    267 //                              break;
    268 //                      }
    269 
    270 //                      report_des = usb_hid_report_find_description(
    271 //                              hid_dev->report, report_id,
    272 //                              USB_HID_REPORT_TYPE_INPUT);
    273 //              }
    274 //              else {
    275 //                      break;
    276 //              }
    277         } while (!matches && report_id != 0);
    278        
    279 //      usb_log_debug("Size of the input report: %zu\n", size);
     208        size_t size = 0;
     209        usb_hid_report_field_t *field = usb_hid_report_get_sibling (hid_dev->report,
     210                NULL, usage_path, mapping->compare, USB_HID_REPORT_TYPE_INPUT);
     211        while(field != NULL) {
     212                size++;
     213                field = usb_hid_report_get_sibling (hid_dev->report,
     214                                        field, usage_path, mapping->compare,
     215                            USB_HID_REPORT_TYPE_INPUT);
     216        }
     217       
     218        usb_log_debug("Size of the input report: %zuB\n", size);
    280219        usb_hid_report_path_free(usage_path);
    281220       
    282         return matches;
     221        return (size > 0);
    283222}
    284223
     
    429368       
    430369        do {
    431                 usb_log_debug("Getting size of the report.\n");
    432370                size = usb_hid_report_byte_size(hid_dev->report, report_id,
    433371                    USB_HID_REPORT_TYPE_INPUT);
    434372                usb_log_debug("Report ID: %u, size: %zu\n", report_id, size);
    435373                max_size = (size > max_size) ? size : max_size;
    436                 usb_log_debug("Getting next report ID\n");
    437374                report_id = usb_hid_get_next_report_id(hid_dev->report,
    438375                    report_id, USB_HID_REPORT_TYPE_INPUT);
     
    564501                    hid_dev->subdriver_count);
    565502                //usb_hid_free(&hid_dev);
    566                
    567503        } else {
    568504                bool ok = false;
     
    591527        }
    592528       
    593        
    594         if (rc == EOK) {
    595                 // save max input report size and allocate space for the report
    596                 rc = usb_hid_init_report(hid_dev);
    597                 if (rc != EOK) {
    598                         usb_log_error("Failed to initialize input report buffer"
    599                             ".\n");
    600                 }
    601         }
    602        
     529        // save max input report size and allocate space for the report
     530        rc = usb_hid_init_report(hid_dev);
     531        if (rc != EOK) {
     532                usb_log_error("Failed to initialize input report buffer.\n");
     533        }
    603534       
    604535        return rc;
     
    623554        usb_log_debug("Max input report size: %zu, buffer size: %zu\n",
    624555            hid_dev->max_input_report_size, buffer_size);
    625         //assert(hid_dev->max_input_report_size >= buffer_size);
    626         if (hid_dev->max_input_report_size >= buffer_size) {
    627                 /*! @todo This should probably be atomic. */
    628                 memcpy(hid_dev->input_report, buffer, buffer_size);
    629                 hid_dev->input_report_size = buffer_size;
    630                 usb_hid_new_report(hid_dev);
    631         }
     556        assert(hid_dev->max_input_report_size >= buffer_size);
     557       
     558//      if (/*!allocated*/
     559//          /*|| *//*hid_dev->input_report_size < buffer_size*/) {
     560//              uint8_t *input_old = hid_dev->input_report;
     561//              uint8_t *input_new = (uint8_t *)malloc(buffer_size);
     562               
     563//              if (input_new == NULL) {
     564//                      usb_log_error("Failed to allocate space for input "
     565//                          "buffer. This event may not be reported\n");
     566//                      memset(hid_dev->input_report, 0,
     567//                          hid_dev->input_report_size);
     568//              } else {
     569//                      memcpy(input_new, input_old,
     570//                          hid_dev->input_report_size);
     571//                      hid_dev->input_report = input_new;
     572//                      if (allocated) {
     573//                              free(input_old);
     574//                      }
     575//                      usb_hid_new_report();
     576//              }
     577//      }
     578       
     579        /*! @todo This should probably be atomic. */
     580        memcpy(hid_dev->input_report, buffer, buffer_size);
     581        hid_dev->input_report_size = buffer_size;
     582        usb_hid_new_report(hid_dev);
    632583       
    633584        bool cont = false;
  • uspace/drv/usbhub/main.c

    r5da18c7 ra2a3763  
    8787
    8888        usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME);
    89 
     89       
    9090        return usb_driver_main(&usb_hub_driver);
    9191}
  • uspace/drv/usbhub/port_status.h

    r5da18c7 ra2a3763  
    6464 */
    6565static inline void usb_hub_set_port_status_request(
    66     usb_device_request_setup_packet_t *request, uint16_t port) {
     66        usb_device_request_setup_packet_t * request, uint16_t port
     67        ) {
    6768        request->index = port;
    6869        request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
     
    7879 */
    7980static inline void usb_hub_set_hub_status_request(
    80     usb_device_request_setup_packet_t *request) {
     81        usb_device_request_setup_packet_t * request
     82        ) {
    8183        request->index = 0;
    8284        request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS;
     
    9395static inline usb_device_request_setup_packet_t *
    9496usb_hub_create_port_status_request(uint16_t port) {
    95         usb_device_request_setup_packet_t *result =
    96             malloc(sizeof (usb_device_request_setup_packet_t));
     97        usb_device_request_setup_packet_t * result =
     98                malloc(sizeof(usb_device_request_setup_packet_t));
    9799        usb_hub_set_port_status_request(result, port);
    98100        return result;
     
    106108 */
    107109static inline void usb_hub_set_enable_port_feature_request(
    108     usb_device_request_setup_packet_t *request, uint16_t port,
    109     uint16_t feature_selector) {
     110        usb_device_request_setup_packet_t * request, uint16_t port,
     111        uint16_t feature_selector
     112        ) {
    110113        request->index = port;
    111114        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    122125 */
    123126static inline void usb_hub_set_disable_port_feature_request(
    124     usb_device_request_setup_packet_t *request, uint16_t port,
    125     uint16_t feature_selector
    126     ) {
     127        usb_device_request_setup_packet_t * request, uint16_t port,
     128        uint16_t feature_selector
     129        ) {
    127130        request->index = port;
    128131        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    138141 */
    139142static inline void usb_hub_set_enable_port_request(
    140     usb_device_request_setup_packet_t *request, uint16_t port
    141     ) {
     143        usb_device_request_setup_packet_t * request, uint16_t port
     144        ) {
    142145        request->index = port;
    143146        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    154157static inline usb_device_request_setup_packet_t *
    155158usb_hub_create_enable_port_request(uint16_t port) {
    156         usb_device_request_setup_packet_t *result =
    157             malloc(sizeof (usb_device_request_setup_packet_t));
     159        usb_device_request_setup_packet_t * result =
     160                malloc(sizeof(usb_device_request_setup_packet_t));
    158161        usb_hub_set_enable_port_request(result, port);
    159162        return result;
     
    166169 */
    167170static inline void usb_hub_set_disable_port_request(
    168     usb_device_request_setup_packet_t *request, uint16_t port
    169     ) {
     171        usb_device_request_setup_packet_t * request, uint16_t port
     172        ) {
    170173        request->index = port;
    171174        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    182185static inline usb_device_request_setup_packet_t *
    183186usb_hub_create_disable_port_request(uint16_t port) {
    184         usb_device_request_setup_packet_t *result =
    185             malloc(sizeof (usb_device_request_setup_packet_t));
     187        usb_device_request_setup_packet_t * result =
     188                malloc(sizeof(usb_device_request_setup_packet_t));
    186189        usb_hub_set_disable_port_request(result, port);
    187190        return result;
     
    194197 */
    195198static inline void usb_hub_set_reset_port_request(
    196     usb_device_request_setup_packet_t *request, uint16_t port
    197     ) {
     199        usb_device_request_setup_packet_t * request, uint16_t port
     200        ) {
    198201        request->index = port;
    199202        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    210213static inline usb_device_request_setup_packet_t *
    211214usb_hub_create_reset_port_request(uint16_t port) {
    212         usb_device_request_setup_packet_t *result =
    213             malloc(sizeof (usb_device_request_setup_packet_t));
     215        usb_device_request_setup_packet_t * result =
     216                malloc(sizeof(usb_device_request_setup_packet_t));
    214217        usb_hub_set_reset_port_request(result, port);
    215218        return result;
     
    222225 */
    223226static inline void usb_hub_set_power_port_request(
    224     usb_device_request_setup_packet_t *request, uint16_t port
    225     ) {
     227        usb_device_request_setup_packet_t * request, uint16_t port
     228        ) {
    226229        request->index = port;
    227230        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    237240 */
    238241static inline void usb_hub_unset_power_port_request(
    239     usb_device_request_setup_packet_t *request, uint16_t port
    240     ) {
     242        usb_device_request_setup_packet_t * request, uint16_t port
     243        ) {
    241244        request->index = port;
    242245        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    254257 */
    255258static inline bool usb_port_is_status(usb_port_status_t status, int idx) {
    256         return (status & (1 << idx)) != 0;
     259        return (status&(1 << idx))!=0;
    257260}
    258261
     
    265268 */
    266269static inline void usb_port_status_set_bit(
    267     usb_port_status_t * status, int idx, bool value) {
     270        usb_port_status_t * status, int idx, bool value) {
    268271        (*status) = value ?
    269             ((*status) | (1 << (idx))) :
    270             ((*status)&(~(1 << (idx))));
     272                ((*status) | (1 << (idx))) :
     273                ((*status)&(~(1 << (idx))));
    271274}
    272275
     
    279282 */
    280283static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) {
    281         return (status & (1 << idx)) != 0;
     284        return (status&(1 << idx))!=0;
    282285}
    283286
     
    290293 */
    291294static inline void usb_hub_status_set_bit(
    292     usb_hub_status_t *status, int idx, bool value) {
     295        usb_hub_status_t * status, int idx, bool value) {
    293296        (*status) = value ?
    294             ((*status) | (1 << (idx))) :
    295             ((*status)&(~(1 << (idx))));
    296 }
    297 
     297                ((*status) | (1 << (idx))) :
     298                ((*status)&(~(1 << (idx))));
     299}
     300
     301
     302#if 0
     303/**
     304 * connection status geter for port status
     305 *
     306 * @param status
     307 * @return true if there is something connected
     308 */
     309static inline bool usb_port_dev_connected(usb_port_status_t * status) {
     310        return usb_port_get_bit(status, 0);
     311}
     312
     313/**
     314 * set device connected bit in port status
     315 *
     316 * @param status
     317 * @param connected value of the bit
     318 */
     319static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
     320        usb_port_set_bit(status, 0, connected);
     321}
     322
     323//port enabled
     324
     325/**
     326 * port enabled getter for port status
     327 *
     328 * @param status
     329 * @return true if the port is enabled
     330 */
     331static inline bool usb_port_enabled(usb_port_status_t * status) {
     332        return usb_port_get_bit(status, 1);
     333}
     334
     335/**
     336 * set port enabled bit in port status
     337 *
     338 * @param status
     339 * @param enabled value of the bit
     340 */
     341static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
     342        usb_port_set_bit(status, 1, enabled);
     343}
     344
     345//port suspended
     346/**
     347 * port suspended getter for port status
     348 *
     349 * @param status
     350 * @return true if port is suspended
     351 */
     352static inline bool usb_port_suspended(usb_port_status_t * status) {
     353        return usb_port_get_bit(status, 2);
     354}
     355
     356/**
     357 * set port suspended bit in port status
     358 *
     359 * @param status
     360 * @param suspended value of the bit
     361 */
     362static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
     363        usb_port_set_bit(status, 2, suspended);
     364}
     365
     366//over currect
     367/**
     368 * over current condition indicator getter for port status
     369 *
     370 * @param status
     371 * @return true if there is opver-current condition on the hub
     372 */
     373static inline bool usb_port_over_current(usb_port_status_t * status) {
     374        return usb_port_get_bit(status, 3);
     375}
     376
     377/**
     378 * set over current indicator bit in port status
     379 *
     380 * @param status
     381 * @param value value of the bit
     382 */
     383static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
     384        usb_port_set_bit(status, 3, value);
     385}
     386
     387//port reset
     388/**
     389 * port reset indicator getter for port status
     390 *
     391 * @param status
     392 * @return true if port is reset
     393 */
     394static inline bool usb_port_reset(usb_port_status_t * status) {
     395        return usb_port_get_bit(status, 4);
     396}
     397
     398/**
     399 * set port reset bit in port status
     400 *
     401 * @param status
     402 * @param value value of the bit
     403 */
     404static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
     405        usb_port_set_bit(status, 4, value);
     406}
     407
     408//powered
     409/**
     410 * power state getter for port status
     411 *
     412 * @param status
     413 * @return true if port is powered
     414 */
     415static inline bool usb_port_powered(usb_port_status_t * status) {
     416        return usb_port_get_bit(status, 8);
     417}
     418
     419/**
     420 * set port powered bit in port status
     421 *
     422 * @param status
     423 * @param powered value of the bit
     424 */
     425static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
     426        usb_port_set_bit(status, 8, powered);
     427}
     428
     429#endif
     430
     431//low speed device attached
    298432/**
    299433 * low speed device on the port indicator
     
    312446 * @param low_speed value of the bit
    313447 */
    314 static inline void usb_port_set_low_speed(usb_port_status_t *status, bool low_speed) {
     448static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {
    315449        usb_port_status_set_bit(status, 9, low_speed);
    316450}
    317451
    318452//high speed device attached
    319 
    320453/**
    321454 * high speed device on the port indicator
     
    334467 * @param high_speed value of the bit
    335468 */
    336 static inline void usb_port_set_high_speed(usb_port_status_t *status, bool high_speed) {
     469static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {
    337470        usb_port_status_set_bit(status, 10, high_speed);
    338471}
     
    352485}
    353486
     487#if 0
     488//connect change
     489/**
     490 * port connect change indicator
     491 *
     492 * @param status
     493 * @return true if connection has changed
     494 */
     495static inline bool usb_port_connect_change(usb_port_status_t * status) {
     496        return usb_port_get_bit(status, 16);
     497}
     498
     499/**
     500 * set connection change bit in port status
     501 * @param status
     502 * @param change value of the bit
     503 */
     504static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
     505        usb_port_set_bit(status, 16, change);
     506}
     507
     508//port enable change
     509/**
     510 * port enable change for port status
     511 *
     512 * @param status
     513 * @return true if the port has been enabled/disabled
     514 */
     515static inline bool usb_port_enabled_change(usb_port_status_t * status) {
     516        return usb_port_get_bit(status, 17);
     517}
     518
     519/**
     520 * set port enable change bit in port status
     521 *
     522 * @param status
     523 * @param change value of the bit
     524 */
     525static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
     526        usb_port_set_bit(status, 17, change);
     527}
     528
     529//suspend change
     530/**
     531 * port suspend change for port status
     532 *
     533 * @param status
     534 * @return ture if suspend status has changed
     535 */
     536static inline bool usb_port_suspend_change(usb_port_status_t * status) {
     537        return usb_port_get_bit(status, 18);
     538}
     539
     540/**
     541 * set port suspend change bit in port status
     542 *
     543 * @param status
     544 * @param change value of the bit
     545 */
     546static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
     547        usb_port_set_bit(status, 18, change);
     548}
     549
     550//over current change
     551/**
     552 * over current change indicator
     553 *
     554 * @param status
     555 * @return true if over-current condition on port has changed
     556 */
     557static inline bool usb_port_overcurrent_change(usb_port_status_t * status) {
     558        return usb_port_get_bit(status, 19);
     559}
     560
     561/**
     562 * set port over current change bit in port status
     563 *
     564 * @param status
     565 * @param change value of the bit
     566 */
     567static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
     568        usb_port_set_bit(status, 19, change);
     569}
     570
     571//reset change
     572/**
     573 * port reset change indicator
     574 * @param status
     575 * @return true if port has been reset
     576 */
     577static inline bool usb_port_reset_completed(usb_port_status_t * status) {
     578        return usb_port_get_bit(status, 20);
     579}
     580
     581/**
     582 * set port reset completed bit in port status
     583 *
     584 * @param status
     585 * @param change value of the bit
     586 */
     587static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
     588        usb_port_set_bit(status, 20, completed);
     589}
     590
     591//local power status
     592/**
     593 * local power lost indicator for hub status
     594 *
     595 * @param status
     596 * @return true if hub is not powered
     597 */
     598static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) {
     599        return usb_hub_get_bit(status, 0);
     600}
     601
     602/**
     603 * set hub power lost bit in hub status
     604 *
     605 * @param status
     606 * @param change value of the bit
     607 */
     608static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
     609        bool power_lost) {
     610        usb_hub_set_bit(status, 0, power_lost);
     611}
     612
     613//over current ocndition
     614/**
     615 * hub over-current indicator
     616 *
     617 * @param status
     618 * @return true if over-current condition occurred on hub
     619 */
     620static inline bool usb_hub_over_current(usb_hub_status_t * status) {
     621        return usb_hub_get_bit(status, 1);
     622}
     623
     624/**
     625 * set hub over current bit in hub status
     626 *
     627 * @param status
     628 * @param change value of the bit
     629 */
     630static inline void usb_hub_set_over_current(usb_port_status_t * status,
     631        bool over_current) {
     632        usb_hub_set_bit(status, 1, over_current);
     633}
     634
     635//local power change
     636/**
     637 * hub power change indicator
     638 *
     639 * @param status
     640 * @return true if local power status has been changed - power has been
     641 * dropped or re-established
     642 */
     643static inline bool usb_hub_local_power_change(usb_hub_status_t * status) {
     644        return usb_hub_get_bit(status, 16);
     645}
     646
     647/**
     648 * set hub power change bit in hub status
     649 *
     650 * @param status
     651 * @param change value of the bit
     652 */
     653static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
     654        bool change) {
     655        usb_hub_set_bit(status, 16, change);
     656}
     657
     658//local power status
     659/**
     660 * hub over-current condition change indicator
     661 *
     662 * @param status
     663 * @return true if over-current condition has changed
     664 */
     665static inline bool usb_hub_over_current_change(usb_hub_status_t * status) {
     666        return usb_hub_get_bit(status, 17);
     667}
     668
     669/**
     670 * set hub over current change bit in hub status
     671 *
     672 * @param status
     673 * @param change value of the bit
     674 */
     675static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
     676        bool change) {
     677        usb_hub_set_bit(status, 17, change);
     678}
     679#endif
    354680
    355681
  • uspace/drv/usbhub/ports.c

    r5da18c7 ra2a3763  
    4747#include "port_status.h"
    4848
     49
    4950/** Information for fibril for device discovery. */
    5051struct add_device_phase1 {
     
    6465 * any function here and must be cleared by hand
    6566 */
    66 static const int non_handled_changes[] = {
     67static const int non_handled_changes[] =  {
    6768        USB_HUB_FEATURE_C_PORT_ENABLE,
    6869        USB_HUB_FEATURE_C_PORT_SUSPEND
     
    7071
    7172static void usb_hub_removed_device(
    72     usb_hub_info_t *hub, uint16_t port);
    73 
    74 static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
    75     uint16_t port, uint32_t status);
    76 
    77 static void usb_hub_port_over_current(usb_hub_info_t *hub,
    78     uint16_t port, uint32_t status);
     73        usb_hub_info_t * hub, uint16_t port);
     74
     75static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
     76        uint16_t port, uint32_t status);
     77
     78static void usb_hub_port_over_current(usb_hub_info_t * hub,
     79        uint16_t port, uint32_t status);
    7980
    8081static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
     
    9596 * @param port port number, starting from 1
    9697 */
    97 void usb_hub_process_interrupt(usb_hub_info_t *hub,
    98     uint16_t port) {
    99         usb_log_debug("Interrupt at port %zu\n", (size_t) port);
     98void usb_hub_process_interrupt(usb_hub_info_t * hub,
     99        uint16_t port) {
     100        usb_log_debug("interrupt at port %zu\n", (size_t) port);
    100101        //determine type of change
    101102        //usb_pipe_t *pipe = hub->control_pipe;
     
    133134        if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) {
    134135                //check if it was not auto-resolved
    135                 usb_log_debug("Overcurrent change on port\n");
     136                usb_log_debug("overcurrent change on port\n");
    136137                usb_hub_port_over_current(hub, port, status);
    137138        }
     
    140141                usb_hub_port_reset_completed(hub, port, status);
    141142        }
    142         usb_log_debug("Status x%x : %d\n ", status, status);
     143        usb_log_debug("status x%x : %d\n ", status, status);
    143144
    144145        usb_port_status_set_bit(
    145             &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);
     146            &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false);
    146147        usb_port_status_set_bit(
    147             &status, USB_HUB_FEATURE_C_PORT_RESET, false);
     148            &status, USB_HUB_FEATURE_C_PORT_RESET,false);
    148149        usb_port_status_set_bit(
    149             &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);
    150 
     150            &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false);
     151       
    151152        //clearing not yet handled changes     
    152153        unsigned int feature_idx;
    153         for (feature_idx = 0;
    154             feature_idx < non_handled_changes_count;
    155             ++feature_idx) {
     154        for(feature_idx = 0;feature_idx<non_handled_changes_count;
     155            ++feature_idx){
    156156                unsigned int bit_idx = non_handled_changes[feature_idx];
    157                 if (status & (1 << bit_idx)) {
     157                if(status & (1<<bit_idx)){
    158158                        usb_log_info(
    159                             "There was not yet handled change on port %d: %d"
     159                            "there was not yet handled change on port %d: %d"
    160160                            ";clearing it\n",
    161                             port, bit_idx);
     161                        port, bit_idx);
    162162                        int opResult = usb_hub_clear_port_feature(
    163163                            hub->control_pipe,
     
    165165                        if (opResult != EOK) {
    166166                                usb_log_warning(
    167                                     "Could not clear port flag %d: %s\n",
    168                                     bit_idx, str_error(opResult)
     167                                    "could not clear port flag %d: %d\n",
     168                                    bit_idx, opResult
    169169                                    );
    170170                        }
    171171                        usb_port_status_set_bit(
    172                             &status, bit_idx, false);
     172                            &status, bit_idx,false);
    173173                }
    174174        }
    175         if (status >> 16) {
    176                 usb_log_info("There is still some unhandled change %X\n",
     175        if(status>>16){
     176                usb_log_info("there is still some unhandled change %X\n",
    177177                    status);
    178178        }
    179179}
     180
    180181
    181182/**
     
    189190 */
    190191static void usb_hub_removed_device(
    191     usb_hub_info_t *hub, uint16_t port) {
     192        usb_hub_info_t * hub, uint16_t port) {
    192193
    193194        int opResult = usb_hub_clear_port_feature(hub->control_pipe,
    194             port, USB_HUB_FEATURE_C_PORT_CONNECTION);
     195                port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    195196        if (opResult != EOK) {
    196                 usb_log_warning("Could not clear port-change-connection flag\n");
     197                usb_log_warning("could not clear port-change-connection flag\n");
    197198        }
    198199        /** \TODO remove device from device manager - not yet implemented in
     
    230231}
    231232
     233
    232234/**
    233235 * Process port reset change
     
    239241 * @param status
    240242 */
    241 static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
    242     uint16_t port, uint32_t status) {
     243static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
     244        uint16_t port, uint32_t status){
    243245        usb_log_debug("Port %zu reset complete.\n", (size_t) port);
    244246        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) {
     
    272274 * @param port port number, starting from 1
    273275 */
    274 static void usb_hub_port_over_current(usb_hub_info_t *hub,
    275     uint16_t port, uint32_t status) {
     276static void usb_hub_port_over_current(usb_hub_info_t * hub,
     277        uint16_t port, uint32_t status) {
    276278        int opResult;
    277         if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) {
     279        if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){
    278280                opResult = usb_hub_clear_port_feature(hub->control_pipe,
    279                     port, USB_HUB_FEATURE_PORT_POWER);
     281                        port, USB_HUB_FEATURE_PORT_POWER);
    280282                if (opResult != EOK) {
    281                         usb_log_error("Cannot power off port %d; %s\n",
    282                             port, str_error(opResult));
     283                        usb_log_error("cannot power off port %d;  %d\n",
     284                                port, opResult);
    283285                }
    284         } else {
     286        }else{
    285287                opResult = usb_hub_set_port_feature(hub->control_pipe,
    286                     port, USB_HUB_FEATURE_PORT_POWER);
     288                        port, USB_HUB_FEATURE_PORT_POWER);
    287289                if (opResult != EOK) {
    288                         usb_log_error("Cannot power on port %d; %s\n",
    289                             port, str_error(opResult));
     290                        usb_log_error("cannot power on port %d;  %d\n",
     291                                port, opResult);
    290292                }
    291293        }
     
    300302 */
    301303static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
    302     usb_port_status_t *status) {
     304    usb_port_status_t *status)
     305{
    303306        size_t recv_size;
    304307        usb_device_request_setup_packet_t request;
     
    307310        usb_hub_set_port_status_request(&request, port);
    308311        int rc = usb_pipe_control_read(ctrl_pipe,
    309             &request, sizeof (usb_device_request_setup_packet_t),
    310             &status_tmp, sizeof (status_tmp), &recv_size);
     312            &request, sizeof(usb_device_request_setup_packet_t),
     313            &status_tmp, sizeof(status_tmp), &recv_size);
    311314        if (rc != EOK) {
    312315                return rc;
     
    333336 * @return Error code.
    334337 */
    335 static int enable_port_callback(int port_no, void *arg) {
     338static int enable_port_callback(int port_no, void *arg)
     339{
    336340        usb_hub_info_t *hub = arg;
    337341        int rc;
     
    341345        usb_hub_set_reset_port_request(&request, port_no);
    342346        rc = usb_pipe_control_write(hub->control_pipe,
    343             &request, sizeof (request), NULL, 0);
     347            &request, sizeof(request), NULL, 0);
    344348        if (rc != EOK) {
    345349                usb_log_warning("Port reset failed: %s.\n", str_error(rc));
     
    371375 * @return 0 Always.
    372376 */
    373 static int add_device_phase1_worker_fibril(void *arg) {
     377static int add_device_phase1_worker_fibril(void *arg)
     378{
    374379        struct add_device_phase1 *data
    375380            = (struct add_device_phase1 *) arg;
     
    413418}
    414419
     420
    415421/** Start device adding when connection change is detected.
    416422 *
     
    423429 */
    424430static int create_add_device_fibril(usb_hub_info_t *hub, size_t port,
    425     usb_speed_t speed) {
     431    usb_speed_t speed)
     432{
    426433        struct add_device_phase1 *data
    427             = malloc(sizeof (struct add_device_phase1));
     434            = malloc(sizeof(struct add_device_phase1));
    428435        if (data == NULL) {
    429436                return ENOMEM;
  • uspace/drv/usbhub/ports.h

    r5da18c7 ra2a3763  
    7070
    7171
    72 void usb_hub_process_interrupt(usb_hub_info_t *hub,
     72void usb_hub_process_interrupt(usb_hub_info_t * hub,
    7373        uint16_t port);
    7474
  • uspace/drv/usbhub/usbhub.c

    r5da18c7 ra2a3763  
    5656
    5757
    58 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev);
    59 
    60 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info);
    61 
    62 static int usb_hub_set_configuration(usb_hub_info_t *hub_info);
    63 
    64 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info);
    65 
    66 static int usb_process_hub_over_current(usb_hub_info_t *hub_info,
     58static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev);
     59
     60static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info);
     61
     62static int usb_hub_set_configuration(usb_hub_info_t * hub_info);
     63
     64static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info);
     65
     66static int usb_process_hub_over_current(usb_hub_info_t * hub_info,
    6767    usb_hub_status_t status);
    6868
    69 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info,
     69static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
    7070    usb_hub_status_t status);
    7171
    72 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info);
    73 
    74 static void usb_hub_polling_terminated_callback(usb_device_t *device,
    75     bool was_error, void *data);
     72static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info);
     73
     74static void usb_hub_polling_terminated_callback(usb_device_t * device,
     75    bool was_error, void * data);
    7676
    7777
     
    9090 * @return error code
    9191 */
    92 int usb_hub_add_device(usb_device_t *usb_dev) {
     92int usb_hub_add_device(usb_device_t * usb_dev) {
    9393        if (!usb_dev) return EINVAL;
    94         usb_hub_info_t *hub_info = usb_hub_info_create(usb_dev);
     94        usb_hub_info_t * hub_info = usb_hub_info_create(usb_dev);
    9595        //create hc connection
    9696        usb_log_debug("Initializing USB wire abstraction.\n");
     
    9999            hub_info->usb_device->ddf_dev);
    100100        if (opResult != EOK) {
    101                 usb_log_error("Could not initialize connection to device, "
    102                     " %s\n",
    103                     str_error(opResult));
     101                usb_log_error("could not initialize connection to device, "
     102                    "errno %d\n",
     103                    opResult);
    104104                free(hub_info);
    105105                return opResult;
     
    109109        opResult = usb_hub_set_configuration(hub_info);
    110110        if (opResult != EOK) {
    111                 usb_log_error("Could not set hub configuration, %s\n",
    112                     str_error(opResult));
     111                usb_log_error("could not set hub configuration, errno %d\n",
     112                    opResult);
    113113                free(hub_info);
    114114                return opResult;
     
    117117        opResult = usb_hub_process_hub_specific_info(hub_info);
    118118        if (opResult != EOK) {
    119                 usb_log_error("Could process hub specific info, %s\n",
    120                     str_error(opResult));
     119                usb_log_error("could process hub specific info, errno %d\n",
     120                    opResult);
    121121                free(hub_info);
    122122                return opResult;
     
    135135
    136136        opResult = usb_hub_start_hub_fibril(hub_info);
    137         if (opResult != EOK)
     137        if(opResult!=EOK)
    138138                free(hub_info);
    139139        return opResult;
    140140}
     141
    141142
    142143/** Callback for polling hub for changes.
     
    192193 * @return basic usb_hub_info_t structure
    193194 */
    194 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev) {
    195         usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t));
     195static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) {
     196        usb_hub_info_t * result = malloc(sizeof(usb_hub_info_t));
    196197        if (!result) return NULL;
    197198        result->usb_device = usb_dev;
     
    201202
    202203        result->ports = NULL;
    203         result->port_count = (size_t) - 1;
     204        result->port_count = (size_t) -1;
    204205        fibril_mutex_initialize(&result->port_mutex);
    205206
     
    220221 * @return error code
    221222 */
    222 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) {
     223static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) {
    223224        // get hub descriptor
    224         usb_log_debug("Creating serialized descriptor\n");
     225        usb_log_debug("creating serialized descriptor\n");
    225226        uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE];
    226227        usb_hub_descriptor_t * descriptor;
     
    234235
    235236        if (opResult != EOK) {
    236                 usb_log_error("Failed when receiving hub descriptor, "
    237                     "%s\n",
    238                     str_error(opResult));
     237                usb_log_error("failed when receiving hub descriptor, "
     238                    "badcode = %d\n",
     239                    opResult);
    239240                free(serialized_descriptor);
    240241                return opResult;
    241242        }
    242         usb_log_debug2("Deserializing descriptor\n");
     243        usb_log_debug2("deserializing descriptor\n");
    243244        descriptor = usb_create_deserialized_hub_desriptor(
    244245            serialized_descriptor);
     
    249250        usb_log_debug("setting port count to %d\n", descriptor->ports_count);
    250251        hub_info->port_count = descriptor->ports_count;
     252        /// \TODO this is not semantically correct
    251253        bool is_power_switched =
    252             ((descriptor->hub_characteristics & 1) == 0);
     254            ((descriptor->hub_characteristics & 1) ==0);
    253255        bool has_individual_port_powering =
    254             ((descriptor->hub_characteristics & 1) != 0);
     256            ((descriptor->hub_characteristics & 1) !=0);
    255257        hub_info->ports = malloc(
    256258            sizeof (usb_hub_port_t) * (hub_info->port_count + 1));
    257         if (!hub_info->ports) {
     259        if(!hub_info->ports){
    258260                return ENOMEM;
    259261        }
     
    262264                usb_hub_port_init(&hub_info->ports[port]);
    263265        }
    264         if (is_power_switched) {
    265                 usb_log_debug("Hub power switched\n");
    266 
    267                 if (!has_individual_port_powering) {
    268                         usb_log_debug("Has_global powering\n");
     266        if(is_power_switched){
     267                usb_log_debug("is_power_switched\n");
     268               
     269                if(!has_individual_port_powering){
     270                        usb_log_debug("!has_individual_port_powering\n");
    269271                        opResult = usb_hub_set_feature(hub_info->control_pipe,
    270272                            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
    271273                        if (opResult != EOK) {
    272                                 usb_log_error("Cannot power hub: %s\n",
     274                                usb_log_error("cannot power hub: %s\n",
    273275                                    str_error(opResult));
    274276                        }
     
    276278
    277279                for (port = 1; port <= hub_info->port_count; ++port) {
    278                         usb_log_debug("Powering port %zu.\n", port);
     280                        usb_log_debug("Powering port %zu.\n",port);
    279281                        opResult = usb_hub_set_port_feature(hub_info->control_pipe,
    280282                            port, USB_HUB_FEATURE_PORT_POWER);
     
    284286                        }
    285287                }
    286 
    287         } else {
    288                 usb_log_debug("Power not switched, not going to be powered\n");
    289         }
    290         usb_log_debug2("Freeing data\n");
     288               
     289        }else{
     290                usb_log_debug("!is_power_switched, not going to be powered\n");
     291        }
     292        usb_log_debug2("freeing data\n");
    291293        free(descriptor);
    292294        return EOK;
     
    301303 * @return error code
    302304 */
    303 static int usb_hub_set_configuration(usb_hub_info_t *hub_info) {
     305static int usb_hub_set_configuration(usb_hub_info_t * hub_info) {
    304306        //device descriptor
    305307        usb_standard_device_descriptor_t *std_descriptor
    306308            = &hub_info->usb_device->descriptors.device;
    307         usb_log_debug("Hub has %d configurations\n",
     309        usb_log_debug("hub has %d configurations\n",
    308310            std_descriptor->configuration_count);
    309311        if (std_descriptor->configuration_count < 1) {
    310                 usb_log_error("There are no configurations available\n");
     312                usb_log_error("there are no configurations available\n");
    311313                return EINVAL;
    312314        }
     
    326328                return opResult;
    327329        }
    328         usb_log_debug("\tUsed configuration %d\n",
     330        usb_log_debug("\tused configuration %d\n",
    329331            config_descriptor->configuration_number);
    330332
     
    341343 * @return error code
    342344 */
    343 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info) {
     345static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){
    344346        int rc;
    345347
     
    365367//*********************************************
    366368
     369
    367370/**
    368371 * process hub over current change
     
    373376 * @return error code
    374377 */
    375 static int usb_process_hub_over_current(usb_hub_info_t *hub_info,
     378static int usb_process_hub_over_current(usb_hub_info_t * hub_info,
    376379    usb_hub_status_t status) {
    377380        int opResult;
    378         if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)) {
     381        if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_OVER_CURRENT)){
    379382                //poweroff all ports
    380383                unsigned int port;
    381                 for (port = 1; port <= hub_info->port_count; ++port) {
     384                for(port = 1;port <= hub_info->port_count;++port){
    382385                        opResult = usb_hub_clear_port_feature(
    383                             hub_info->control_pipe, port,
     386                            hub_info->control_pipe,port,
    384387                            USB_HUB_FEATURE_PORT_POWER);
    385388                        if (opResult != EOK) {
    386389                                usb_log_warning(
    387                                     "Cannot power off port %d;  %s\n",
    388                                     port, str_error(opResult));
     390                                    "cannot power off port %d;  %d\n",
     391                                    port, opResult);
    389392                        }
    390393                }
     
    392395                //power all ports
    393396                unsigned int port;
    394                 for (port = 1; port <= hub_info->port_count; ++port) {
     397                for(port = 1;port <= hub_info->port_count;++port){
    395398                        opResult = usb_hub_set_port_feature(
    396                             hub_info->control_pipe, port,
     399                            hub_info->control_pipe,port,
    397400                            USB_HUB_FEATURE_PORT_POWER);
    398401                        if (opResult != EOK) {
    399402                                usb_log_warning(
    400                                     "Cannot power off port %d;  %s\n",
    401                                     port, str_error(opResult));
     403                                    "cannot power off port %d;  %d\n",
     404                                    port, opResult);
    402405                        }
    403406                }
     
    414417 * @return error code
    415418 */
    416 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info,
     419static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
    417420    usb_hub_status_t status) {
    418421        int opResult = EOK;
    419422        opResult = usb_hub_clear_feature(hub_info->control_pipe,
    420423            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
    421         if (opResult != EOK) {
    422                 usb_log_error("Cannnot clear hub power change flag: "
    423                     "%s\n",
    424                     str_error(opResult));
     424                if (opResult != EOK) {
     425                usb_log_error("cannnot clear hub power change flag: "
     426                    "%d\n",
     427                    opResult);
    425428        }
    426429        return opResult;
     
    434437 * @param hub_info hub instance
    435438 */
    436 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info) {
    437         usb_log_debug("Global interrupt on a hub\n");
     439static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) {
     440        usb_log_debug("global interrupt on a hub\n");
    438441        usb_pipe_t *pipe = hub_info->control_pipe;
    439442        int opResult;
     
    452455            );
    453456        if (opResult != EOK) {
    454                 usb_log_error("Could not get hub status: %s\n",
    455                     str_error(opResult));
     457                usb_log_error("could not get hub status\n");
    456458                return;
    457459        }
    458460        if (rcvd_size != sizeof (usb_port_status_t)) {
    459                 usb_log_error("Received status has incorrect size\n");
     461                usb_log_error("received status has incorrect size\n");
    460462                return;
    461463        }
    462464        //port reset
    463465        if (
    464             usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {
     466            usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {
    465467                usb_process_hub_over_current(hub_info, status);
    466468        }
    467469        if (
    468             usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {
     470            usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {
    469471                usb_process_hub_local_power_change(hub_info, status);
    470472        }
     
    479481 * @param data pointer to usb_hub_info_t structure
    480482 */
    481 static void usb_hub_polling_terminated_callback(usb_device_t *device,
    482     bool was_error, void *data) {
     483static void usb_hub_polling_terminated_callback(usb_device_t * device,
     484    bool was_error, void * data){
    483485        usb_hub_info_t * hub = data;
    484486        assert(hub);
  • uspace/drv/usbhub/usbhub.h

    r5da18c7 ra2a3763  
    5151#include "ports.h"
    5252
     53
     54
    5355/** Information about attached hub. */
    54 struct usb_hub_info_t {
     56struct usb_hub_info_t{
    5557        /** Number of ports. */
    5658        size_t port_count;
     
    104106};
    105107
    106 int usb_hub_add_device(usb_device_t *usb_dev);
     108//int usb_hub_control_loop(void * hub_info_param);
     109
     110int usb_hub_add_device(usb_device_t * usb_dev);
    107111
    108112bool hub_port_changes_callback(usb_device_t *dev,
  • uspace/drv/usbhub/usbhub_private.h

    r5da18c7 ra2a3763  
    6565 */
    6666static inline void usb_hub_set_descriptor_request(
    67     usb_device_request_setup_packet_t * request
    68     ) {
     67usb_device_request_setup_packet_t * request
     68){
    6969        request->index = 0;
    7070        request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR;
     
    8787    int port_index,
    8888    usb_hub_class_feature_t feature) {
    89 
     89       
    9090        usb_device_request_setup_packet_t clear_request = {
    9191                .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE,
     
    9696        clear_request.value = feature;
    9797        return usb_pipe_control_write(pipe, &clear_request,
    98             sizeof (clear_request), NULL, 0);
     98            sizeof(clear_request), NULL, 0);
    9999}
    100100
     
    120120        clear_request.value = feature;
    121121        return usb_pipe_control_write(pipe, &clear_request,
    122             sizeof (clear_request), NULL, 0);
     122            sizeof(clear_request), NULL, 0);
    123123}
     124
    124125
    125126/**
     
    141142        clear_request.value = feature;
    142143        return usb_pipe_control_write(pipe, &clear_request,
    143             sizeof (clear_request), NULL, 0);
     144            sizeof(clear_request), NULL, 0);
    144145}
    145146
     
    162163        clear_request.value = feature;
    163164        return usb_pipe_control_write(pipe, &clear_request,
    164             sizeof (clear_request), NULL, 0);
     165            sizeof(clear_request), NULL, 0);
    165166}
    166167
  • uspace/drv/usbhub/utils.c

    r5da18c7 ra2a3763  
    6262 * @return newly created serializd descriptor pointer
    6363 */
    64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t *descriptor) {
     64void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) {
    6565        //base size
    6666        size_t size = 7;
    6767        //variable size according to port count
    68         size_t var_size = (descriptor->ports_count + 7) / 8;
     68        size_t var_size = (descriptor->ports_count+7)/8;
    6969        size += 2 * var_size;
    7070        uint8_t * result = malloc(size);
    7171        //size
    72         if (result)
    73                 usb_serialize_hub_descriptor(descriptor, result);
     72        if(result)
     73                usb_serialize_hub_descriptor(descriptor,result);
    7474        return result;
    7575}
     
    8282 * @param serialized_descriptor
    8383 */
    84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t *descriptor,
     84void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor,
    8585    void * serialized_descriptor) {
    8686        //base size
     
    8888        size_t size = 7;
    8989        //variable size according to port count
    90         size_t var_size = (descriptor->ports_count + 7) / 8;
     90        size_t var_size = (descriptor->ports_count+7)/8;
    9191        size += 2 * var_size;
    9292        //size
     
    110110}
    111111
     112
    112113/**
    113114 * create deserialized desriptor structure out of serialized descriptor
     
    120121 */
    121122usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor(
    122     void *serialized_descriptor) {
     123void * serialized_descriptor) {
    123124        uint8_t * sdescriptor = serialized_descriptor;
    124125
     
    129130        }
    130131
    131         usb_hub_descriptor_t * result = malloc(sizeof (usb_hub_descriptor_t));
    132         if (result)
    133                 usb_deserialize_hub_desriptor(serialized_descriptor, result);
     132        usb_hub_descriptor_t * result = malloc(sizeof(usb_hub_descriptor_t));
     133        if(result)
     134                usb_deserialize_hub_desriptor(serialized_descriptor,result);
    134135        return result;
    135136}
     
    143144 */
    144145void usb_deserialize_hub_desriptor(
    145     void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {
     146void * serialized_descriptor, usb_hub_descriptor_t * descriptor) {
    146147        uint8_t * sdescriptor = serialized_descriptor;
    147148        descriptor->ports_count = sdescriptor[2];
     
    150151        descriptor->pwr_on_2_good_time = sdescriptor[5];
    151152        descriptor->current_requirement = sdescriptor[6];
    152         size_t var_size = (descriptor->ports_count + 7) / 8;
     153        size_t var_size = (descriptor->ports_count+7) / 8;
    153154        //descriptor->devices_removable = (uint8_t*) malloc(var_size);
    154155
  • uspace/lib/usbhid/src/hiddescriptor.c

    r5da18c7 ra2a3763  
    187187
    188188                field = malloc(sizeof(usb_hid_report_field_t));
    189                 if(field == NULL) {
    190                         return ENOMEM;
    191                 }
    192 
    193189                memset(field, 0, sizeof(usb_hid_report_field_t));
    194190                list_initialize(&field->link);
     
    220216                        }
    221217                        else {
    222                                 usage = report_item->usages[
     218                                usage = report_item->usages[
    223219                                        report_item->usages_count- 1];
    224220                        }
     
    245241
    246242                field->size = report_item->size;
    247 
    248                 if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
    249                         int offset = report_item->offset + report_item->size * i;
    250                         int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 -
    251                                 offset - report_item->size;
    252                         if(field_offset < 0) {
    253                                 field->offset = 0;
    254                         }
    255                         else {
    256                                 field->offset = field_offset;
    257                         }
    258                 }
    259                 else {
    260                         field->offset = report_item->offset + (i * report_item->size);
    261                 }
    262 
    263 
    264                 if(report->use_report_ids != 0) {
     243               
     244                size_t offset_byte = (report_item->offset + (i *
     245                        report_item->size)) / 8;
     246
     247                size_t offset_bit = 8 - ((report_item->offset + (i *
     248                        report_item->size)) % 8) - report_item->size;
     249
     250                field->offset = 8 * offset_byte + offset_bit;
     251                if(report_item->id != 0) {
    265252                        field->offset += 8;
    266253                        report->use_report_ids = 1;
    267254                }
    268 
    269255                field->item_flags = report_item->item_flags;
    270256
     
    329315                usb_hid_report_type_t type) {
    330316
    331         if(report == NULL) {
    332                 return NULL;
    333         }
    334 
    335317        link_t *report_it = report->reports.next;
    336318        usb_hid_report_description_t *report_des = NULL;
     
    340322                                usb_hid_report_description_t, link);
    341323
    342                 // if report id not set, return the first of the type
    343                 if(((report_des->report_id == report_id) || (report_id == 0)) &&
     324                if((report_des->report_id == report_id) &&
    344325                   (report_des->type == type)) {
    345326                        return report_des;
  • uspace/lib/usbhid/src/hidparser.c

    r5da18c7 ra2a3763  
    153153
    154154
    155         report_des = usb_hid_report_find_description(report, *report_id,
    156                 type);
    157 
     155        report_des = usb_hid_report_find_description(report, *report_id, type);
    158156        if(report_des == NULL) {
    159157                return EINVAL;
     
    169167                if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {
    170168                       
    171                         if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){
     169                        if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {
    172170
    173171                                // array
     
    176174               
    177175                                item->usage = USB_HID_EXTENDED_USAGE(
    178                                     item->usages[
    179                                     item->value - item->physical_minimum]);
    180 
    181                                 item->usage_page =
    182                                     USB_HID_EXTENDED_USAGE_PAGE(
    183                                     item->usages[
    184                                     item->value - item->physical_minimum]);
    185 
    186                                 usb_hid_report_set_last_item (
    187                                     item->collection_path,
    188                                     USB_HID_TAG_CLASS_GLOBAL,
    189                                     item->usage_page);
    190 
    191                                 usb_hid_report_set_last_item (
    192                                     item->collection_path,
     176                                    item->usages[item->value - item->physical_minimum]);
     177
     178                                item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(
     179                                    item->usages[item->value - item->physical_minimum]);
     180
     181                                usb_hid_report_set_last_item (item->collection_path,
     182                                    USB_HID_TAG_CLASS_GLOBAL, item->usage_page);
     183
     184                                usb_hid_report_set_last_item (item->collection_path,
    193185                                    USB_HID_TAG_CLASS_LOCAL, item->usage);
    194186                               
     
    196188                        else {
    197189                                // variable item
    198                                 item->value = usb_hid_translate_data(item,
    199                                     data);                             
    200                         }                       
     190                                item->value = usb_hid_translate_data(item, data);                               
     191                        }                               
    201192                }
    202193                list_item = list_item->next;
     
    222213       
    223214        int32_t value=0;
    224         int32_t mask=0;
    225         const uint8_t *foo=0;
     215        int32_t mask;
     216        const uint8_t *foo;
    226217
    227218        // now only shot tags are allowed
     
    249240        if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) {
    250241               
    251                 part_size = 0;
     242                part_size = ((offset+item->size)%8);
    252243
    253244                size_t i=0;
     
    255246                        if(i == (size_t)(offset/8)) {
    256247                                // the higher one
    257                                 part_size = 8 - (offset % 8);
    258248                                foo = data + i;
    259249                                mask =  ((1 << (item->size-part_size))-1);
    260                                 value = (*foo & mask);
     250                                value = (*foo & mask) << part_size;
    261251                        }
    262252                        else if(i == ((offset+item->size-1)/8)){
    263253                                // the lower one
    264254                                foo = data + i;
    265                                 mask = ((1 << (item->size - part_size)) - 1)
    266                                         << (8 - (item->size - part_size));
    267 
    268                                 value = (((*foo & mask) >> (8 -
    269                                     (item->size - part_size))) << part_size )
    270                                     + value;
     255                                mask =  ((1 << part_size)-1) << (8-part_size);
     256                                value += ((*foo & mask) >> (8-part_size));
    271257                        }
    272258                        else {
    273                                 value = (*(data + 1) << (part_size + 8)) + value;
    274                                 part_size += 8;
     259                                value = value << 8;
     260                                value += *(data + 1);
    275261                        }
    276262                }
     
    389375                report_item = list_get_instance(item, usb_hid_report_field_t, link);
    390376
    391                 value = usb_hid_translate_data_reverse(report_item,
    392                         report_item->value);
    393 
    394                 offset = report_des->bit_length - report_item->offset - 1;
    395                 length = report_item->size;
    396                
     377                if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) {
     378                                       
     379                        // array
     380                        value = usb_hid_translate_data_reverse(report_item,
     381                                report_item->value);
     382
     383                        offset = report_item->offset;
     384                        length = report_item->size;
     385                }
     386                else {
     387                        // variable item
     388                        value  = usb_hid_translate_data_reverse(report_item,
     389                                report_item->value);
     390
     391                        offset = report_item->offset;
     392                        length = report_item->size;
     393                }
     394
    397395                usb_log_debug("\ttranslated value: %x\n", value);
    398396
     
    605603       
    606604        if(report_id > 0) {
    607                 report_des = usb_hid_report_find_description(report, report_id,
    608                         type);
    609                 if(report_des == NULL) {
    610                         return 0;
    611                 }
    612                 else {
    613                         report_it = report_des->link.next;
    614                 }       
     605                report_it = usb_hid_report_find_description(report, report_id,
     606                        type)->link.next;               
    615607        }
    616608        else {
     
    625617                        return report_des->report_id;
    626618                }
    627 
    628                 report_it = report_it->next;
    629619        }
    630620
  • uspace/lib/usbhid/src/hidpath.c

    r5da18c7 ra2a3763  
    211211
    212212        if(report_path->report_id != path->report_id) {
    213                 if(path->report_id != 0) {
    214                         return 1;
    215                 }
     213                return 1;
    216214        }
    217215
  • uspace/srv/hid/console/console.c

    r5da18c7 ra2a3763  
    768768       
    769769        int phone = fd_phone(fd);
    770         close(fd);
    771770        if (phone < 0) {
    772771                printf(NAME ": Failed to connect to input device\n");
     
    778777            handler, &hash);
    779778        if (rc != EOK) {
    780                 async_hangup(phone);
    781779                printf(NAME ": " \
    782780                    "Failed to create callback from input device: %s.\n",
Note: See TracChangeset for help on using the changeset viewer.