dc13f5d64f
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).
101 lines
3.2 KiB
C
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 */
|