Commit 954ee164 authored by Dan Williams's avatar Dan Williams Committed by David S. Miller

[PATCH] libertas: reorganize and simplify init sequence

This patch moves all firmware load responsibility into the interface-specific
code and gets rid of the firmware pointer in the generic card structure.  It
also removes 3 fairly unecessary callbacks: hw_register_dev, hw_unregister_dev,
and hw_prog_firmware.  It also makes the init sequence from interface
probe functions more logical, as there are paired add/remove and start/stop
calls into generic libertas code.

Because the USB driver code uses the same TX URB callback for both firmware
upload (where the generic libertas structure isn't initialized yet) and for
normal operation (where it is), some bits of USB code have to deal with
'priv' being NULL.  All USB firmware upload bits have been changed to not
require 'priv' at all, but simply the USB card structure.
Signed-off-by: default avatarDan Williams <dcbw@redhat.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent b1b1907d
...@@ -72,8 +72,9 @@ void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str); ...@@ -72,8 +72,9 @@ void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str);
struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band, struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band,
int *cfp_no); int *cfp_no);
wlan_private *libertas_add_card(void *card, struct device *dmdev); wlan_private *libertas_add_card(void *card, struct device *dmdev);
int libertas_activate_card(wlan_private *priv);
int libertas_remove_card(wlan_private *priv); int libertas_remove_card(wlan_private *priv);
int libertas_start_card(wlan_private *priv);
int libertas_stop_card(wlan_private *priv);
int libertas_add_mesh(wlan_private *priv, struct device *dev); int libertas_add_mesh(wlan_private *priv, struct device *dev);
void libertas_remove_mesh(wlan_private *priv); void libertas_remove_mesh(wlan_private *priv);
int libertas_reset_device(wlan_private *priv); int libertas_reset_device(wlan_private *priv);
......
...@@ -143,7 +143,6 @@ struct _wlan_private { ...@@ -143,7 +143,6 @@ struct _wlan_private {
all other bits reserved 0 */ all other bits reserved 0 */
u8 dnld_sent; u8 dnld_sent;
const struct firmware *firmware;
struct device *hotplug_device; struct device *hotplug_device;
/** thread to service interrupts */ /** thread to service interrupts */
...@@ -156,9 +155,6 @@ struct _wlan_private { ...@@ -156,9 +155,6 @@ struct _wlan_private {
struct work_struct sync_channel; struct work_struct sync_channel;
/** Hardware access */ /** Hardware access */
int (*hw_register_dev) (wlan_private * priv);
int (*hw_unregister_dev) (wlan_private *);
int (*hw_prog_firmware) (wlan_private *);
int (*hw_host_to_card) (wlan_private * priv, u8 type, u8 * payload, u16 nb); int (*hw_host_to_card) (wlan_private * priv, u8 type, u8 * payload, u16 nb);
int (*hw_get_int_status) (wlan_private * priv, u8 *); int (*hw_get_int_status) (wlan_private * priv, u8 *);
int (*hw_read_event_cause) (wlan_private *); int (*hw_read_event_cause) (wlan_private *);
......
...@@ -608,51 +608,6 @@ static int if_cs_prog_real(struct if_cs_card *card) ...@@ -608,51 +608,6 @@ static int if_cs_prog_real(struct if_cs_card *card)
/* Callback functions for libertas.ko */ /* Callback functions for libertas.ko */
/********************************************************************/ /********************************************************************/
static int if_cs_register_dev(wlan_private *priv)
{
struct if_cs_card *card = (struct if_cs_card *)priv->card;
lbs_deb_enter(LBS_DEB_CS);
card->priv = priv;
return 0;
}
static int if_cs_unregister_dev(wlan_private *priv)
{
lbs_deb_enter(LBS_DEB_CS);
/*
* Nothing special here. Because the device's power gets turned off
* anyway, there's no need to send a RESET command like in if_usb.c
*/
return 0;
}
/*
* This callback is a dummy. The reason is that the USB code needs
* to have various things set up in order to be able to download the
* firmware. That's not needed in our case.
*
* On the contrary, if libertas_add_card() has been called and we're
* then later called via libertas_activate_card(), but without a valid
* firmware, then it's quite tedious to tear down the half-installed
* card. Therefore, we download the firmware before calling adding/
* activating the card in the first place. If that doesn't work, we
* won't call into libertas.ko at all.
*/
static int if_cs_prog_firmware(wlan_private *priv)
{
priv->adapter->fw_ready = 1;
return 0;
}
/* Send commands or data packets to the card */ /* Send commands or data packets to the card */
static int if_cs_host_to_card(wlan_private *priv, u8 type, u8 *buf, u16 nb) static int if_cs_host_to_card(wlan_private *priv, u8 type, u8 *buf, u16 nb)
{ {
...@@ -902,14 +857,14 @@ static int if_cs_probe(struct pcmcia_device *p_dev) ...@@ -902,14 +857,14 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
} }
/* Store pointers to our call-back functions */ /* Store pointers to our call-back functions */
card->priv = priv;
priv->card = card; priv->card = card;
priv->hw_register_dev = if_cs_register_dev;
priv->hw_unregister_dev = if_cs_unregister_dev;
priv->hw_prog_firmware = if_cs_prog_firmware;
priv->hw_host_to_card = if_cs_host_to_card; priv->hw_host_to_card = if_cs_host_to_card;
priv->hw_get_int_status = if_cs_get_int_status; priv->hw_get_int_status = if_cs_get_int_status;
priv->hw_read_event_cause = if_cs_read_event_cause; priv->hw_read_event_cause = if_cs_read_event_cause;
priv->adapter->fw_ready = 1;
/* Now actually get the IRQ */ /* Now actually get the IRQ */
ret = request_irq(p_dev->irq.AssignedIRQ, if_cs_interrupt, ret = request_irq(p_dev->irq.AssignedIRQ, if_cs_interrupt,
IRQF_SHARED, DRV_NAME, card); IRQF_SHARED, DRV_NAME, card);
...@@ -919,7 +874,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev) ...@@ -919,7 +874,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
} }
/* And finally bring the card up */ /* And finally bring the card up */
if (libertas_activate_card(priv) != 0) { if (libertas_start_card(priv) != 0) {
lbs_pr_err("could not activate card\n"); lbs_pr_err("could not activate card\n");
goto out3; goto out3;
} }
...@@ -951,6 +906,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev) ...@@ -951,6 +906,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev)
lbs_deb_enter(LBS_DEB_CS); lbs_deb_enter(LBS_DEB_CS);
libertas_stop_card(card->priv);
libertas_remove_card(card->priv); libertas_remove_card(card->priv);
if_cs_release(p_dev); if_cs_release(p_dev);
kfree(card); kfree(card);
......
This diff is collapsed.
...@@ -38,7 +38,7 @@ struct bootcmdrespStr ...@@ -38,7 +38,7 @@ struct bootcmdrespStr
/* read callback private data */ /* read callback private data */
struct read_cb_info { struct read_cb_info {
wlan_private *priv; struct usb_card_rec *cardp;
struct sk_buff *skb; struct sk_buff *skb;
}; };
...@@ -58,6 +58,7 @@ struct usb_card_rec { ...@@ -58,6 +58,7 @@ struct usb_card_rec {
int bulk_out_size; int bulk_out_size;
u8 bulk_out_endpointAddr; u8 bulk_out_endpointAddr;
const struct firmware *fw;
u8 CRC_OK; u8 CRC_OK;
u32 fwseqnum; u32 fwseqnum;
u32 lastseqnum; u32 lastseqnum;
...@@ -65,6 +66,7 @@ struct usb_card_rec { ...@@ -65,6 +66,7 @@ struct usb_card_rec {
u32 fwlastblksent; u32 fwlastblksent;
u8 fwdnldover; u8 fwdnldover;
u8 fwfinalblk; u8 fwfinalblk;
u8 surprise_removed;
u32 usb_event_cause; u32 usb_event_cause;
u8 usb_int_cause; u8 usb_int_cause;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment