Files
bes2600-dkms/bes2600/sbus.h
T
test0r f68fd5530f bes2600: Patch H — bh.c hygiene cleanup (drop fossil blocks, dead stubs)
Per Opus structural critique §4.1 (#if 0 graveyard), §4.3 (asm
volatile("nop") placeholder), §4.4 (BUG_ON in steady-state hot
path).  Pure source-tree cleanup, no functional change.

Removed:

  1. bh.c lines 319-395 (76-line #if 0 block) — dead helper
     functions inherited from cw1200 ancestor:
     bes2600_bh_read_ctrl_reg, bes2600_get_skb, bes2600_put_skb,
     bes2600_device_wakeup.  Compiled out for years.

  2. bh.c lines 405-873 + line 1659 (the outer #if 0 / #else /
     #endif) — 468-line cw1200-ancestor bes2600_bh() function body,
     preserved verbatim alongside the active impl.  Same function
     name, same goto labels.  Maintenance hazard removed.

  3. bh.c done: label body — `__bes2600_irq_enable(1)` placeholder
     (commented out) + `asm volatile ("nop")` filler.  Both
     no-ops on bes2600 silicon.

  4. bh.c post-loop "Explicitly disable device interrupts" block
     (sbus lock + __bes2600_irq_enable(0) + sbus unlock) — the
     stub call wrapped in lock/unlock ceremony.  Dead.

  5. hwio.c __bes2600_irq_enable() function definition —
     `int __bes2600_irq_enable(int enable) { return 0; }`.  Stub.
     Removed entirely.

  6. sbus.h __bes2600_irq_enable() forward declaration.

Replaced:

  7. bh.c bes2600_bh outer-loop BUG_ON(hw_bufs_used > numInpChBufs)
     -> WARN_ON_ONCE.  The BUG_ON ran every bh-loop iteration;
     tripping it on a bookkeeping bug locks the kernel up during
     normal operation — the wrong response to a (recoverable)
     accounting drift.  WARN_ON_ONCE surfaces the issue without
     taking the system down.

Why __bes2600_irq_enable was a stub on bes2600:

  cw1200 has the same-named function (drivers/net/wireless/st/cw1200/
  hwio.c:267) that does real work — reads ST90TDS_CONFIG_REG_ID and
  toggles the ST90TDS_CONF_IRQ_RDY_ENABLE bit.  bes2600 inherited
  the function name + signature when forked, but the bes2600 chip's
  IRQ enable is managed by sdio_claim_irq + chip-side firmware, not
  by a driver-side enable register.  Bestechnic kept the function as
  a no-op stub (return 0).  Patch H removes the dead infrastructure.

Diff scope:

  - bes2600/bh.c   -578/+27   (mostly deletions)
  - bes2600/hwio.c -7/+7     (stub function -> comment block)
  - bes2600/sbus.h -2/+1     (declaration -> comment)
  - net: -578/+28 across 3 files

Build verification deferred — ohm offline.  Pure-deletion change,
no semantic risk; the deleted code was either #if 0-gated
(never compiled) or stub-implementations (always returned 0).
2026-05-08 08:23:20 +02:00

101 lines
3.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Bus abstraction interface for BES2600
*
* Copyright (c) 2022, Bestechnic (Beijing) Co., Ltd.
* Replaces hwbus.h from drivers/net/wireless/st/cw1200/
* Copyright (c) 2010, ST-Ericsson
*
*
*/
#ifndef BES2600_SBUS_H
#define BES2600_SBUS_H
/*
* sbus priv forward definition.
* Implemented and instantiated in particular modules.
*/
struct sbus_priv;
struct bes2600_common;
typedef void (*sbus_irq_handler)(void *priv);
enum SUBSYSTEM {
SUBSYSTEM_MCU = 0,
SUBSYSTEM_WIFI,
SUBSYSTEM_BT,
SUBSYSTEM_BT_LP,
};
enum GPIO_WAKE_FLAG
{
GPIO_WAKE_FLAG_MCU = 0,
GPIO_WAKE_FLAG_WIFI_ON,
GPIO_WAKE_FLAG_WIFI_OFF,
GPIO_WAKE_FLAG_BT_ON,
GPIO_WAKE_FLAG_BT_OFF,
GPIO_WAKE_FLAG_BT_LP_ON,
GPIO_WAKE_FLAG_BT_LP_OFF,
GPIO_WAKE_FLAG_HOST_SUSPEND,
GPIO_WAKE_FLAG_HOST_RESUME,
GPIO_WAKE_FLAG_SDIO_RX,
GPIO_WAKE_FLAG_SDIO_PROBE,
};
struct sbus_ops {
int (*init)(struct sbus_priv *self, struct bes2600_common *core);
int (*sbus_memcpy_fromio)(struct sbus_priv *self, unsigned int addr,
void *dst, int count);
int (*sbus_memcpy_toio)(struct sbus_priv *self, unsigned int addr,
const void *src, int count);
void (*lock)(struct sbus_priv *self);
void (*unlock)(struct sbus_priv *self);
int (*irq_subscribe)(struct sbus_priv *self, sbus_irq_handler handler,
void *priv);
int (*irq_unsubscribe)(struct sbus_priv *self);
int (*reset)(struct sbus_priv *self);
size_t (*align_size)(struct sbus_priv *self, size_t size);
int (*set_block_size)(struct sbus_priv *self, size_t size);
int (*pipe_send)(struct sbus_priv *self, u8 pipe, u32 len, u8 *buf);
void * (*pipe_read)(struct sbus_priv *self);
int (*sbus_reg_read)(struct sbus_priv *self, u32 reg,
void *buf, int count);
int (*sbus_reg_write)(struct sbus_priv *self, u32 reg,
const void *buf, int count);
/* sub_system: 0 for mcu, 1 for wifi, 2 for bt, ... */
int (*sbus_active)(struct sbus_priv *self, int sub_system);
int (*sbus_deactive)(struct sbus_priv *self, int sub_system);
int (*power_switch)(struct sbus_priv *self, int on);
/* gpio wake, beacuse bes2600 sdio can't wakeup mcu, so add the two of interfaces */
void (*gpio_wake)(struct sbus_priv *self, int falg);
void (*gpio_sleep)(struct sbus_priv *self, int falg);
/* halt device to get debug information */
void (*halt_device)(struct sbus_priv *self);
bool (*wakeup_source)(struct sbus_priv *self);
int (*reboot)(struct sbus_priv *self);
/*
* Force the host bus to re-detect and re-probe the chip. Called
* from the firmware-wedge recovery path when power_switch() has no
* effective chip-reset signal of its own (e.g. PineTab2, where the
* wifi-reset GPIO is owned by sdio_pwrseq, not the bes2600 node).
* Returns 0 on success or a negative errno.
*/
int (*bus_reset)(struct sbus_priv *self);
/*
* Read a batch of RX frames inline from the bus and deliver each
* one via bes2600_bh_handle_rx_skb(). Called from the bh thread
* (process context, sleepable). Replaces the
* sdio_rx_work + rx_queue + pipe_read relay (Patch C v3, 2026).
* Returns 0 on success, negative on read error.
*/
int (*bus_rx_batch)(struct sbus_priv *self);
};
void bes2600_irq_handler(struct bes2600_common *priv);
/* Patch H: __bes2600_irq_enable removed (was a stub). */
#endif /* BES2600_SBUS_H */