Changeset 01784d2 in mainline for uspace/drv/bus/usb/ar9271/wmi.c


Ignore:
Timestamp:
2015-01-28T18:19:30Z (9 years ago)
Author:
Jan Kolarik <kolarik@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
462054a
Parents:
ef521d4
Message:

Fixed errors in registry read and write, finished reseting device.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ar9271/wmi.c

    ref521d4 r01784d2  
    5252int wmi_reg_read(htc_device_t *htc_device, uint32_t reg_offset, uint32_t *res)
    5353{
    54         uint32_t resp_value;
    5554        uint32_t cmd_value = host2uint32_t_be(reg_offset);
    5655       
     56        size_t buffer_size = MAX_RESPONSE_LENGTH;
     57        void *resp_buffer = malloc(buffer_size);
     58       
    5759        int rc = wmi_send_command(htc_device, WMI_REG_READ,
    58                 (uint8_t *) &cmd_value, sizeof(cmd_value),
    59                 (uint8_t *) &resp_value, sizeof(resp_value));
     60                (uint8_t *) &cmd_value, sizeof(cmd_value), resp_buffer);
    6061       
    6162        if(rc != EOK) {
     
    6465        }
    6566       
    66         *res = uint32_t_be2host(resp_value);
     67        uint32_t *resp_value = (uint32_t *) ((void*) resp_buffer +
     68                sizeof(htc_frame_header_t) +
     69                sizeof(wmi_command_header_t));
     70       
     71        *res = uint32_t_be2host(*resp_value);
    6772       
    6873        return rc;
     
    8085int wmi_reg_write(htc_device_t *htc_device, uint32_t reg_offset, uint32_t val)
    8186{
    82         uint32_t resp_value = host2uint32_t_be(val);   
    8387        uint32_t cmd_buffer[] = {
    8488            host2uint32_t_be(reg_offset),
    85             resp_value
     89            host2uint32_t_be(val)
    8690        };
    8791       
     92        void *resp_buffer = malloc(MAX_RESPONSE_LENGTH);
     93       
    8894        int rc = wmi_send_command(htc_device, WMI_REG_WRITE,
    89                 (uint8_t *) &cmd_buffer, sizeof(cmd_buffer),
    90                 (uint8_t *) &resp_value, sizeof(resp_value));
     95                (uint8_t *) &cmd_buffer, sizeof(cmd_buffer), resp_buffer);
     96       
     97        free(resp_buffer);
    9198       
    9299        if(rc != EOK) {
     
    96103       
    97104        return rc;
     105}
     106
     107/**
     108 * WMI registry set or clear specified bits.
     109 *
     110 * @param htc_device HTC device structure.
     111 * @param reg_offset Registry offset (address) to be written.
     112 * @param set_bit Bit to be set.
     113 * @param clear_bit Bit to be cleared.
     114 *
     115 * @return EOK if succeed, negative error code otherwise.
     116 */
     117int wmi_reg_rmw(htc_device_t *htc_device, uint32_t reg_offset,
     118        uint32_t set_bit, uint32_t clear_bit)
     119{
     120        uint32_t value;
     121       
     122        int rc = wmi_reg_read(htc_device, reg_offset, &value);
     123        if(rc != EOK) {
     124                usb_log_error("Failed to read registry value in RMW "
     125                        "function.\n");
     126                return rc;
     127        }
     128       
     129        value |= set_bit;
     130        value &= ~clear_bit;
     131       
     132        rc = wmi_reg_write(htc_device, reg_offset, value);
     133        if(rc != EOK) {
     134                usb_log_error("Failed to write registry value in RMW "
     135                        "function.\n");
     136                return rc;
     137        }
     138       
     139        return rc;
     140}
     141
     142/**
     143 * WMI registry set specified bit.
     144 *
     145 * @param htc_device HTC device structure.
     146 * @param reg_offset Registry offset (address) to be written.
     147 * @param set_bit Bit to be set.
     148 *
     149 * @return EOK if succeed, negative error code otherwise.
     150 */
     151int wmi_reg_set_bit(htc_device_t *htc_device, uint32_t reg_offset,
     152        uint32_t set_bit)
     153{
     154        return wmi_reg_rmw(htc_device, reg_offset, set_bit, 0);
     155}
     156
     157/**
     158 * WMI registry clear specified bit.
     159 *
     160 * @param htc_device HTC device structure.
     161 * @param reg_offset Registry offset (address) to be written.
     162 * @param clear_bit Bit to be cleared.
     163 *
     164 * @return EOK if succeed, negative error code otherwise.
     165 */
     166int wmi_reg_clear_bit(htc_device_t *htc_device, uint32_t reg_offset,
     167        uint32_t clear_bit)
     168{
     169        return wmi_reg_rmw(htc_device, reg_offset, 0, clear_bit);
    98170}
    99171
     
    107179 * @return EOK if succeed, negative error code otherwise.
    108180 */
    109 int wmi_reg_buffer_write(htc_device_t *htc_device, reg_buffer_t *reg_buffer,
     181int wmi_reg_buffer_write(htc_device_t *htc_device, wmi_reg_t *reg_buffer,
    110182        size_t elements)
    111183{
    112         uint32_t resp_value;
     184        size_t buffer_size = sizeof(wmi_reg_t) * elements;
     185        void *buffer = malloc(buffer_size);
     186        void *resp_buffer = malloc(MAX_RESPONSE_LENGTH);
    113187       
    114188        /* Convert values to correct endianness. */
    115189        for(size_t i = 0; i < elements; i++) {
    116                 reg_buffer_t *buffer_element = &reg_buffer[i];
    117                 buffer_element->offset =
     190                wmi_reg_t *buffer_element = &reg_buffer[i];
     191                wmi_reg_t *buffer_it = (wmi_reg_t *)
     192                        ((void *) buffer + i*sizeof(wmi_reg_t));
     193                buffer_it->offset =
    118194                        host2uint32_t_be(buffer_element->offset);
    119                 buffer_element->value =
     195                buffer_it->value =
    120196                        host2uint32_t_be(buffer_element->value);
    121197        }
    122198       
    123199        int rc = wmi_send_command(htc_device, WMI_REG_WRITE,
    124                 (uint8_t *) &reg_buffer, sizeof(reg_buffer_t)*elements,
    125                 (uint8_t *) &resp_value, sizeof(resp_value));
     200                (uint8_t *) buffer, buffer_size, resp_buffer);
     201       
     202        free(buffer);
     203        free(resp_buffer);
    126204       
    127205        if(rc != EOK) {
     
    141219 * @param command_length Length of command data.
    142220 * @param response_buffer Buffer with response data.
    143  * @param response_length Length of response data.
    144221 *
    145222 * @return EOK if succeed, negative error code otherwise.
    146223 */
    147224int wmi_send_command(htc_device_t *htc_device, wmi_command_t command_id,
    148     uint8_t *command_buffer, uint32_t command_length,
    149     uint8_t *response_buffer, uint32_t response_length)
     225    uint8_t *command_buffer, uint32_t command_length, void *response_buffer)
    150226{
    151227        size_t header_size = sizeof(wmi_command_header_t) +
     
    174250        free(buffer);
    175251       
    176         buffer_size = header_size + response_length;
    177         buffer = malloc(buffer_size);
    178        
    179252        /* Read response. */
    180         rc = htc_read_message(htc_device, buffer, buffer_size, NULL);
     253        rc = htc_read_message(htc_device, response_buffer, MAX_RESPONSE_LENGTH,
     254                NULL);
    181255        if(rc != EOK) {
    182256                free(buffer);
     
    186260        }
    187261       
    188         memcpy(response_buffer,
    189                 buffer + sizeof(wmi_command_header_t),
    190                 response_length);
    191        
    192         free(buffer);
    193        
    194         return rc;
    195 }
     262        return rc;
     263}
Note: See TracChangeset for help on using the changeset viewer.