• Brian Norris's avatar
    mwifiex: don't do unbalanced free()'ing in cleanup_if() · 66b9c182
    Brian Norris authored
    The cleanup_if() callback is the inverse of init_if(). We allocate our
    'card' interface structure in the probe() function, but we free it in
    cleanup_if(). That gives a few problems:
    (a) we leak this memory if probe() fails before we reach init_if()
    (b) we can't safely utilize 'card' after cleanup_if() -- namely, in
        remove() or suspend(), both of which might race with the cleanup
        paths in our asynchronous FW initialization path
    
    Solution: just use devm_kzalloc(), which will free this structure
    properly when the device is removed -- and drop the set_drvdata(...,
    NULL), since the driver core does this for us. This also removes the
    temptation to use drvdata == NULL as a hack for checking if the device
    has been "cleaned up."
    
    I *do* leave the set_drvdata(..., NULL) for the hacky SDIO
    mwifiex_recreate_adapter(), since the device core won't be able to clear
    that one for us.
    Signed-off-by: default avatarBrian Norris <briannorris@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    66b9c182
sdio.c 72.8 KB