Changeset 56c0930 in mainline for uspace/drv/bus/usb/ar9271/ar9271.c


Ignore:
Timestamp:
2015-02-20T14:33:29Z (9 years ago)
Author:
Jan Kolarik <kolarik@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4cb0148
Parents:
ab365c4
Message:

Started writing TX and RX handlers, VIF init, setting RX filter, PLL init and calibration, some corrections. Added HW values array initialization, registered diagnostic polling fibril. But still not receiving any packets…

File:
1 edited

Legend:

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

    rab365c4 r56c0930  
    101101/* IEEE802.11 callbacks */
    102102static int ar9271_ieee80211_start(ieee80211_dev_t *ieee80211_dev);
     103static int ar9271_ieee80211_tx_handler(ieee80211_dev_t *ieee80211_dev,
     104        void *buffer, size_t buffer_size);
    103105
    104106static driver_ops_t ar9271_driver_ops = {
     
    112114
    113115static ieee80211_ops_t ar9271_ieee80211_ops = {
    114         .start = ar9271_ieee80211_start
    115 };
    116 
    117 static int ar9271_set_rx_filter(ar9271_t *ar9271)
    118 {
    119         uint32_t filter_bits;
    120         int rc = wmi_reg_read(ar9271->htc_device, AR9271_RX_FILTER,
    121                 &filter_bits);
    122         if(rc != EOK) {
    123                 usb_log_error("Failed to read RX filter.\n");
    124                 return EINVAL;
    125         }
    126        
    127         /* TODO: Do proper filtering here. */
    128        
    129         filter_bits |= AR9271_RX_FILTER_UNI | AR9271_RX_FILTER_MULTI |
    130                 AR9271_RX_FILTER_BROAD | AR9271_RX_FILTER_PROMISCUOUS;
    131        
    132         rc = wmi_reg_write(ar9271->htc_device, AR9271_RX_FILTER, filter_bits);
    133         if(rc != EOK) {
    134                 usb_log_error("Failed to write RX filter.\n");
    135                 return EINVAL;
    136         }
    137        
    138         return EOK;
    139 }
    140 
    141 static int ar9271_rx_init(ar9271_t *ar9271)
    142 {
    143         int rc = wmi_reg_write(ar9271->htc_device, AR9271_COMMAND,
    144                 AR9271_COMMAND_RX_ENABLE);
    145         if(rc != EOK) {
    146                 usb_log_error("Failed to send RX enable command.\n");
    147                 return EINVAL;
    148         }
    149        
    150         rc = ar9271_set_rx_filter(ar9271);
    151         if(rc != EOK) {
    152                 usb_log_error("Failed to set RX filtering.\n");
    153                 return EINVAL;
    154         }
     116        .start = ar9271_ieee80211_start,
     117        .tx_handler = ar9271_ieee80211_tx_handler
     118};
     119
     120static int ar9271_ieee80211_tx_handler(ieee80211_dev_t *ieee80211_dev,
     121        void *buffer, size_t buffer_size)
     122{
     123        /* TODO: Process TX message properly */
     124       
     125        size_t complete_size, offset;
     126        void *complete_buffer;
     127        int endpoint;
     128       
     129        ar9271_t *ar9271 = (ar9271_t *) ieee80211_dev->driver_data;
     130       
     131        ieee80211_header_t *ieee80211_header = (ieee80211_header_t *) buffer;
     132       
     133        if(ieee80211_is_data_frame(ieee80211_header)) {
     134                offset = sizeof(htc_frame_header_t);
     135                complete_size = buffer_size + offset;
     136                complete_buffer = malloc(complete_size);
     137                endpoint = ar9271->htc_device->endpoints.data_be_endpoint;
     138        } else {
     139                offset = sizeof(htc_tx_management_header_t) +
     140                        sizeof(htc_frame_header_t);
     141                complete_size = buffer_size + offset;
     142                complete_buffer = malloc(complete_size);
     143                endpoint = ar9271->htc_device->endpoints.mgmt_endpoint;
     144        }
     145       
     146        /* Copy IEEE802.11 data to new allocated buffer with HTC headers. */
     147        memcpy(complete_buffer + offset, buffer, buffer_size);
     148       
     149        htc_send_data_message(ar9271->htc_device, complete_buffer,
     150                complete_size, endpoint);
     151       
     152        free(complete_buffer);
     153       
     154        return EOK;
     155}
     156
     157static int ar9271_data_polling(void *arg)
     158{
     159        ar9271_t *ar9271 = (ar9271_t *) arg;
     160        size_t buffer_size = ar9271->ath_device->data_response_length;
     161        void *buffer = malloc(buffer_size);
     162       
     163        while(true) {
     164                int rc =
     165                htc_read_data_message(ar9271->htc_device, buffer, buffer_size,
     166                        NULL);
     167                usb_log_info("RC is %d.\n", rc);
     168               
     169                /* TODO: Process RX message */
     170        }
     171       
     172        return EOK;
     173}
     174
     175static int ar9271_diag_polling(void *arg)
     176{
     177        ar9271_t *ar9271 = (ar9271_t *) arg;
     178       
     179        while(true) {
     180                uint32_t result;
     181                wmi_reg_read(ar9271->htc_device, 0x80F0, &result);
     182                usb_log_info("RX count: %x\n", result);
     183                wmi_reg_read(ar9271->htc_device, 0x8098, &result);
     184                usb_log_info("Beacon count: %x\n", result);
     185                sleep(1);
     186        }
     187       
     188        return EOK;
     189}
     190
     191static int ar9271_register_polling_fibrils(ar9271_t *ar9271)
     192{
     193        /* Add data polling fibril. */
     194        fid_t fibril = fibril_create(ar9271_data_polling, ar9271);
     195        if (fibril == 0) {
     196                return ENOMEM;
     197        }
     198        fibril_add_ready(fibril);
     199       
     200        /* Add debug polling fibril. */
     201        fibril = fibril_create(ar9271_diag_polling, ar9271);
     202        if (fibril == 0) {
     203                return ENOMEM;
     204        }
     205        fibril_add_ready(fibril);
    155206       
    156207        return EOK;
     
    165216        if(rc != EOK) {
    166217                usb_log_error("Failed to flush receiving buffer.\n");
    167                 return EINVAL;
     218                return rc;
    168219        }
    169220       
     
    171222        if(rc != EOK) {
    172223                usb_log_error("Failed to do HW reset.\n");
    173                 return EINVAL;
     224                return rc;
    174225        }
    175226       
     
    179230        if(rc != EOK) {
    180231                usb_log_error("Failed to set HTC mode.\n");
    181                 return EINVAL;
     232                return rc;
    182233        }
    183234       
     
    186237        if(rc != EOK) {
    187238                usb_log_error("Failed to send ath init command.\n");
    188                 return EINVAL;
     239                return rc;
    189240        }
    190241       
     
    193244        if(rc != EOK) {
    194245                usb_log_error("Failed to send receiving init command.\n");
    195                 return EINVAL;
    196         }
    197        
    198         rc = ar9271_rx_init(ar9271);
     246                return rc;
     247        }
     248       
     249        rc = hw_rx_init(ar9271);
    199250        if(rc != EOK) {
    200251                usb_log_error("Failed to initialize RX.\n");
    201                 return EINVAL;
     252                return rc;
     253        }
     254       
     255        rc = htc_init_new_vif(ar9271->htc_device);
     256        if(rc != EOK) {
     257                usb_log_error("Failed to initialize new VIF.\n");
     258                return rc;
     259        }
     260       
     261        rc = ar9271_register_polling_fibrils(ar9271);
     262        if(rc != EOK) {
     263                usb_log_error("Failed to register polling fibrils.\n");
     264                return rc;
    202265        }
    203266       
     
    220283                free(ar9271->ath_device);
    221284                usb_log_error("Failed to initialize ath device.\n");
    222                 return EINVAL;
     285                return rc;
     286        }
     287       
     288        /* IEEE 802.11 framework structure initialization. */
     289        ar9271->ieee80211_dev = calloc(1, sizeof(ieee80211_dev_t));
     290        if (!ar9271->ieee80211_dev) {
     291                free(ar9271->ath_device);
     292                usb_log_error("Failed to allocate memory for IEEE80211 device "
     293                    "structure.\n");
     294                return ENOMEM;
     295        }
     296       
     297        rc = ieee80211_device_init(ar9271->ieee80211_dev, ar9271,
     298                ar9271->ddf_dev);
     299        if(rc != EOK) {
     300                free(ar9271->ieee80211_dev);
     301                free(ar9271->ath_device);
     302                usb_log_error("Failed to initialize IEEE80211 device structure."
     303                        "\n");
     304                return rc;
    223305        }
    224306               
     
    226308        ar9271->htc_device = calloc(1, sizeof(htc_device_t));
    227309        if(!ar9271->htc_device) {
     310                free(ar9271->ieee80211_dev);
    228311                free(ar9271->ath_device);
    229312                usb_log_error("Failed to allocate memory for HTC device "
     
    232315        }
    233316       
    234         rc = htc_device_init(ar9271->ath_device, ar9271->htc_device);
     317        rc = htc_device_init(ar9271->ath_device, ar9271->ieee80211_dev,
     318                ar9271->htc_device);
    235319        if(rc != EOK) {
    236320                free(ar9271->htc_device);
     321                free(ar9271->ieee80211_dev);
    237322                free(ar9271->ath_device);
    238323                usb_log_error("Failed to initialize HTC device structure.\n");
    239                 return EINVAL;
    240         }
    241        
    242         /* IEEE 802.11 framework structure initialization. */
    243         ar9271->ieee80211_dev = calloc(1, sizeof(ieee80211_dev_t));
    244         if (!ar9271->ieee80211_dev) {
    245                 free(ar9271->htc_device);
    246                 free(ar9271->ath_device);
    247                 usb_log_error("Failed to allocate memory for IEEE80211 device "
    248                     "structure.\n");
    249                 return ENOMEM;
    250         }
    251        
    252         rc = ieee80211_device_init(ar9271->ieee80211_dev, ar9271,
    253                 ar9271->ddf_dev);
    254         if(rc != EOK) {
    255                 free(ar9271->ieee80211_dev);
    256                 free(ar9271->htc_device);
    257                 free(ar9271->ath_device);
    258                 usb_log_error("Failed to initialize IEEE80211 device structure."
    259                         "\n");
    260                 return EINVAL;
     324                return rc;
    261325        }
    262326       
Note: See TracChangeset for help on using the changeset viewer.