On 2016-09-08 09:52, Sergey Ryazanov wrote:
>> +
>> +int mt76x2_register_device(struct mt76x2_dev *dev)
>> +{
>> + struct ieee80211_hw *hw = mt76_hw(dev);
>> + struct wiphy *wiphy = hw->wiphy;
>> + void *status_fifo;
>> + int fifo_size;
>> + int i, ret;
>> +
>> + fifo_size = roundup_pow_of_two(32 * sizeof(struct mt76x2_tx_status));
>> + status_fifo = devm_kzalloc(dev->mt76.dev, fifo_size, GFP_KERNEL);
>> + if (!status_fifo)
>> + return -ENOMEM;
>> +
>> + kfifo_init(&dev->txstatus_fifo, status_fifo, fifo_size);
>> +
>> + ret = mt76x2_init_hardware(dev);
>> + if (ret)
>> + return ret;
>> +
>> + hw->queues = 4;
>> + hw->max_rates = 1;
>> + hw->max_report_rates = 7;
>> + hw->max_rate_tries = 1;
>> + hw->extra_tx_headroom = 2;
>> +
>> + hw->sta_data_size = sizeof(struct mt76x2_sta);
>> + hw->vif_data_size = sizeof(struct mt76x2_vif);
>> +
>> + for (i = 0; i < ARRAY_SIZE(dev->macaddr_list); i++) {
>> + u8 *addr = dev->macaddr_list[i].addr;
>> +
>> + memcpy(addr, dev->mt76.macaddr, ETH_ALEN);
>> +
>> + if (!i)
>> + continue;
>> +
>> + addr[0] |= BIT(1);
>> + addr[0] ^= ((i - 1) << 2);
>> + }
>> + wiphy->addresses = dev->macaddr_list;
>> + wiphy->n_addresses = ARRAY_SIZE(dev->macaddr_list);
>> +
>> + wiphy->iface_combinations = if_comb;
>> + wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
>> +
>> + wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
>> +
>> + ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
>> + INIT_DELAYED_WORK(&dev->cal_work, mt76x2_phy_calibrate);
>> + INIT_DELAYED_WORK(&dev->mac_work, mt76x2_mac_work);
>> +
>> + dev->mt76.sband_2g.sband.ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
>> + dev->mt76.sband_5g.sband.ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
>> +
>> + ret = mt76_register_device(&dev->mt76, true, mt76x2_rates,
>> + ARRAY_SIZE(mt76x2_rates));
>> + if (ret)
>> + goto fail;
>> +
>> + mt76x2_init_debugfs(dev);
>> +
>> + return 0;
>> +
>> +fail:
>> + mt76x2_stop_hardware(dev);
>> + return ret;
>> +}
>
> Just curious, almost full chip initialization performed in probe
> procedure, why not do that in start() callback? In such case we could
> fully restart chip without module reloading, just with ifdown/ifup
> circle.
Last time I tried that I ran into some weird chip quirks. I do think
it's a good idea but I'd rather see this merged first and try again to
rework it when I have some more time to figure out what's going on.
- Felix