Search Linux Wireless

Re: [PATCH] b43: Add hooks for firmware debugging

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, May 17, 2008 at 10:44 PM, Michael Buesch <mb@xxxxxxxxx> wrote:
> This patch adds some hooks for firmware debugging.
>
> Signed-off-by: Michael Buesch <mb@xxxxxxxxx>
>
> ---
>
> John, this is for 2.6.27
>
>
> Index: wireless-testing/drivers/net/wireless/b43/b43.h
> ===================================================================
> --- wireless-testing.orig/drivers/net/wireless/b43/b43.h        2008-05-15 23:31:37.000000000 +0200
> +++ wireless-testing/drivers/net/wireless/b43/b43.h     2008-05-17 20:22:56.000000000 +0200
> @@ -419,12 +419,18 @@ enum {
>                                         B43_IRQ_TXFIFO_FLUSH_OK | \
>                                         B43_IRQ_NOISESAMPLE_OK | \
>                                         B43_IRQ_UCODE_DEBUG | \
>                                         B43_IRQ_RFKILL | \
>                                         B43_IRQ_TX_OK)
>
> +/* Debug-IRQ reasons. */
> +#define B43_DEBUGIRQ_PANIC             0       /* The firmware panic'ed */
> +#define B43_DEBUGIRQ_DUMP_SHM          1       /* Dump shared SHM */
> +#define B43_DEBUGIRQ_DUMP_REGS         2       /* Dump the microcode registers */
> +#define B43_DEBUGIRQ_ACK               0xFFFF  /* The host writes that to ACK the IRQ */
> +
>  /* Device specific rate values.
>  * The actual values defined here are (rate_in_mbps * 2).
>  * Some code depends on this. Don't change it. */
>  #define B43_CCK_RATE_1MB               0x02
>  #define B43_CCK_RATE_2MB               0x04
>  #define B43_CCK_RATE_5MB               0x0B
> @@ -763,12 +769,15 @@ struct b43_firmware {
>        struct b43_firmware_file initvals_band;
>
>        /* Firmware revision */
>        u16 rev;
>        /* Firmware patchlevel */
>        u16 patch;
> +
> +       /* Set to true, if we are using an opensource firmware. */
> +       bool opensource;
>  };
>
>  /* Device (802.11 core) initialization status. */
>  enum {
>        B43_STAT_UNINIT = 0,    /* Uninitialized. */
>        B43_STAT_INITIALIZED = 1,       /* Initialized, but not started, yet. */
> Index: wireless-testing/drivers/net/wireless/b43/main.c
> ===================================================================
> --- wireless-testing.orig/drivers/net/wireless/b43/main.c       2008-05-15 23:31:37.000000000 +0200
> +++ wireless-testing/drivers/net/wireless/b43/main.c    2008-05-17 22:35:00.000000000 +0200
> @@ -1663,13 +1663,70 @@ static void b43_set_beacon_int(struct b4
>        b43_time_unlock(dev);
>        b43dbg(dev->wl, "Set beacon interval to %u\n", beacon_int);
>  }
>
>  static void handle_irq_ucode_debug(struct b43_wldev *dev)
>  {
> -       //TODO
> +       unsigned int i, cnt;
> +       u16 reason;
> +       __le16 *buf;
> +
> +       /* The proprietary firmware doesn't have this IRQ. */
> +       if (!dev->fw.opensource)
> +               return;
> +
> +       /* Microcode register 63 contains the debug-IRQ reason. */
> +       reason = b43_shm_read16(dev, B43_SHM_SCRATCH, 63);
> +       switch (reason) {
> +       case B43_DEBUGIRQ_PANIC:
> +               /* The reason for the panic is in register 3. */
> +               reason = b43_shm_read16(dev, B43_SHM_SCRATCH, 3);
> +               b43err(dev->wl, "Whoopsy, the microcode panic'ed! Reason: %u\n",
> +                      reason);
> +               b43_controller_restart(dev, "Microcode panic");
> +               break;
> +       case B43_DEBUGIRQ_DUMP_SHM:
> +               if (!B43_DEBUG)
> +                       break; /* Only with driver debugging enabled. */
> +               buf = kmalloc(4096, GFP_ATOMIC);
> +               if (!buf) {
> +                       b43dbg(dev->wl, "SHM-dump: Failed to allocate memory\n");
> +                       goto out;
> +               }
> +               for (i = 0; i < 4096; i += 2) {
> +                       u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, i);
> +                       buf[i / 2] = cpu_to_le16(tmp);
> +               }
> +               b43info(dev->wl, "Shared memory dump:\n");
> +               print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET,
> +                              16, 2, buf, 4096, 1);
> +               kfree(buf);
> +               break;
> +       case B43_DEBUGIRQ_DUMP_REGS:
> +               if (!B43_DEBUG)
> +                       break; /* Only with driver debugging enabled. */
> +               b43info(dev->wl, "Microcode register dump:\n");
> +               for (i = 0, cnt = 0; i < 64; i++) {
> +                       u16 tmp = b43_shm_read16(dev, B43_SHM_SCRATCH, i);
> +                       if (cnt == 0)
> +                               printk(KERN_INFO);
> +                       printk("r%02u: 0x%04X  ", i, tmp);
> +                       cnt++;
> +                       if (cnt == 6) {
> +                               printk("\n");
> +                               cnt = 0;
> +                       }
> +               }
> +               printk("\n");
> +               break;
> +       default:
> +               b43dbg(dev->wl, "Debug-IRQ triggered for unknown reason: %u\n",
> +                      reason);
> +       }
> +out:
> +       b43_shm_write16(dev, B43_SHM_SCRATCH, 63, B43_DEBUGIRQ_ACK);
>  }
>
>  /* Interrupt handler bottom-half */
>  static void b43_interrupt_tasklet(struct b43_wldev *dev)
>  {
>        u32 reason;
> @@ -2121,20 +2178,28 @@ static int b43_upload_microcode(struct b
>                       "binary drivers older than version 4.x is unsupported. "
>                       "You must upgrade your firmware files.\n");
>                b43_print_fw_helptext(dev->wl, 1);
>                err = -EOPNOTSUPP;
>                goto error;
>        }
> -       b43info(dev->wl, "Loading firmware version %u.%u "
> -               "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
> -               fwrev, fwpatch,
> -               (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
> -               (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
> -
>        dev->fw.rev = fwrev;
>        dev->fw.patch = fwpatch;
> +       dev->fw.opensource = (fwdate == 0xFFFF);
> +
> +       if (dev->fw.opensource) {
> +               /* Patchlevel info is encoded in the "time" field. */
> +               dev->fw.patch = fwtime;
> +               b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n",
> +                       dev->fw.rev, dev->fw.patch);
> +       } else {
> +               b43info(dev->wl, "Loading firmware version %u.%u "
> +                       "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
> +                       fwrev, fwpatch,
> +                       (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
> +                       (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
> +       }
>
>        if (b43_is_old_txhdr_format(dev)) {
>                b43warn(dev->wl, "You are using an old firmware image. "
>                        "Support for old firmware will be removed in July 2008.\n");
>                b43_print_fw_helptext(dev->wl, 0);
>        }
> _______________________________________________
> Bcm43xx-dev mailing list
> Bcm43xx-dev@xxxxxxxxxxxxxxxx
> https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
>

Hmm... what's this? Are we planning something along the lines of
prism54's FreeMAC?

-- 
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux