提交 45432371 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6: (42 commits)
  Staging: usbip: fix build warning on 64bit kernels
  Staging: me4000: remove some compiler warnings
  Staging: wbusb: fix a bunch of compiler warnings
  Staging: w35und: module init cleanup
  Staging: w35und: use gotos for error handling
  Staging: w35und: remove spinlock wrappers
  Staging: sxg: fix compiler warnings.
  Staging: sxg: fix up unused function warnings
  Staging: sxg: clean up C99 comments
  Staging: Lindent the echo driver
  Staging: SLICOSS: Free multicast list at driver exit
  Staging: PCC-ACPI: Fix all checkpatch errors
  Staging: pcc-acpi: update to latest version
  Staging: Clean up sxg driver
  Staging: remove remaining uses of __FUNCTION__
  Staging: add poch driver
  Staging: wlan-ng: fix build error if wireless networking is not enabled
  Staging: echo: remove annoying "end of function" markers
  Staging: echo: remove __cplusplus macro magic
  Staging: echo: remove dead code
  ...
...@@ -43,4 +43,8 @@ source "drivers/staging/echo/Kconfig" ...@@ -43,4 +43,8 @@ source "drivers/staging/echo/Kconfig"
source "drivers/staging/at76_usb/Kconfig" source "drivers/staging/at76_usb/Kconfig"
source "drivers/staging/pcc-acpi/Kconfig"
source "drivers/staging/poch/Kconfig"
endif # STAGING endif # STAGING
...@@ -13,3 +13,5 @@ obj-$(CONFIG_W35UND) += winbond/ ...@@ -13,3 +13,5 @@ obj-$(CONFIG_W35UND) += winbond/
obj-$(CONFIG_PRISM2_USB) += wlan-ng/ obj-$(CONFIG_PRISM2_USB) += wlan-ng/
obj-$(CONFIG_ECHO) += echo/ obj-$(CONFIG_ECHO) += echo/
obj-$(CONFIG_USB_ATMEL) += at76_usb/ obj-$(CONFIG_USB_ATMEL) += at76_usb/
obj-$(CONFIG_PCC_ACPI) += pcc-acpi/
obj-$(CONFIG_POCH) += poch/
...@@ -2319,9 +2319,11 @@ static int at76_iw_handler_get_scan(struct net_device *netdev, ...@@ -2319,9 +2319,11 @@ static int at76_iw_handler_get_scan(struct net_device *netdev,
if (!iwe) if (!iwe)
return -ENOMEM; return -ENOMEM;
if (priv->scan_state != SCAN_COMPLETED) if (priv->scan_state != SCAN_COMPLETED) {
/* scan not yet finished */ /* scan not yet finished */
kfree(iwe);
return -EAGAIN; return -EAGAIN;
}
spin_lock_irqsave(&priv->bss_list_spinlock, flags); spin_lock_irqsave(&priv->bss_list_spinlock, flags);
......
...@@ -30,114 +30,98 @@ ...@@ -30,114 +30,98 @@
#if !defined(_BIT_OPERATIONS_H_) #if !defined(_BIT_OPERATIONS_H_)
#define _BIT_OPERATIONS_H_ #define _BIT_OPERATIONS_H_
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
/*! \brief Find the bit position of the highest set bit in a word /*! \brief Find the bit position of the highest set bit in a word
\param bits The word to be searched \param bits The word to be searched
\return The bit number of the highest set bit, or -1 if the word is zero. */ \return The bit number of the highest set bit, or -1 if the word is zero. */
static __inline__ int top_bit(unsigned int bits) static __inline__ int top_bit(unsigned int bits)
{ {
int res; int res;
__asm__ (" xorl %[res],%[res];\n" __asm__(" xorl %[res],%[res];\n"
" decl %[res];\n" " decl %[res];\n"
" bsrl %[bits],%[res]\n" " bsrl %[bits],%[res]\n"
: [res] "=&r" (res) :[res] "=&r" (res)
: [bits] "rm" (bits)); :[bits] "rm"(bits)
return res; );
return res;
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Find the bit position of the lowest set bit in a word /*! \brief Find the bit position of the lowest set bit in a word
\param bits The word to be searched \param bits The word to be searched
\return The bit number of the lowest set bit, or -1 if the word is zero. */ \return The bit number of the lowest set bit, or -1 if the word is zero. */
static __inline__ int bottom_bit(unsigned int bits) static __inline__ int bottom_bit(unsigned int bits)
{ {
int res; int res;
__asm__ (" xorl %[res],%[res];\n" __asm__(" xorl %[res],%[res];\n"
" decl %[res];\n" " decl %[res];\n"
" bsfl %[bits],%[res]\n" " bsfl %[bits],%[res]\n"
: [res] "=&r" (res) :[res] "=&r" (res)
: [bits] "rm" (bits)); :[bits] "rm"(bits)
return res; );
return res;
} }
/*- End of function --------------------------------------------------------*/
#else #else
static __inline__ int top_bit(unsigned int bits) static __inline__ int top_bit(unsigned int bits)
{ {
int i; int i;
if (bits == 0) if (bits == 0)
return -1; return -1;
i = 0; i = 0;
if (bits & 0xFFFF0000) if (bits & 0xFFFF0000) {
{ bits &= 0xFFFF0000;
bits &= 0xFFFF0000; i += 16;
i += 16; }
} if (bits & 0xFF00FF00) {
if (bits & 0xFF00FF00) bits &= 0xFF00FF00;
{ i += 8;
bits &= 0xFF00FF00; }
i += 8; if (bits & 0xF0F0F0F0) {
} bits &= 0xF0F0F0F0;
if (bits & 0xF0F0F0F0) i += 4;
{ }
bits &= 0xF0F0F0F0; if (bits & 0xCCCCCCCC) {
i += 4; bits &= 0xCCCCCCCC;
} i += 2;
if (bits & 0xCCCCCCCC) }
{ if (bits & 0xAAAAAAAA) {
bits &= 0xCCCCCCCC; bits &= 0xAAAAAAAA;
i += 2; i += 1;
} }
if (bits & 0xAAAAAAAA) return i;
{
bits &= 0xAAAAAAAA;
i += 1;
}
return i;
} }
/*- End of function --------------------------------------------------------*/
static __inline__ int bottom_bit(unsigned int bits) static __inline__ int bottom_bit(unsigned int bits)
{ {
int i; int i;
if (bits == 0) if (bits == 0)
return -1; return -1;
i = 32; i = 32;
if (bits & 0x0000FFFF) if (bits & 0x0000FFFF) {
{ bits &= 0x0000FFFF;
bits &= 0x0000FFFF; i -= 16;
i -= 16; }
} if (bits & 0x00FF00FF) {
if (bits & 0x00FF00FF) bits &= 0x00FF00FF;
{ i -= 8;
bits &= 0x00FF00FF; }
i -= 8; if (bits & 0x0F0F0F0F) {
} bits &= 0x0F0F0F0F;
if (bits & 0x0F0F0F0F) i -= 4;
{ }
bits &= 0x0F0F0F0F; if (bits & 0x33333333) {
i -= 4; bits &= 0x33333333;
} i -= 2;
if (bits & 0x33333333) }
{ if (bits & 0x55555555) {
bits &= 0x33333333; bits &= 0x55555555;
i -= 2; i -= 1;
} }
if (bits & 0x55555555) return i;
{
bits &= 0x55555555;
i -= 1;
}
return i;
} }
/*- End of function --------------------------------------------------------*/
#endif #endif
/*! \brief Bit reverse a byte. /*! \brief Bit reverse a byte.
...@@ -146,16 +130,16 @@ static __inline__ int bottom_bit(unsigned int bits) ...@@ -146,16 +130,16 @@ static __inline__ int bottom_bit(unsigned int bits)
static __inline__ uint8_t bit_reverse8(uint8_t x) static __inline__ uint8_t bit_reverse8(uint8_t x)
{ {
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
/* If multiply is fast */ /* If multiply is fast */
return ((x*0x0802U & 0x22110U) | (x*0x8020U & 0x88440U))*0x10101U >> 16; return ((x * 0x0802U & 0x22110U) | (x * 0x8020U & 0x88440U)) *
0x10101U >> 16;
#else #else
/* If multiply is slow, but we have a barrel shifter */ /* If multiply is slow, but we have a barrel shifter */
x = (x >> 4) | (x << 4); x = (x >> 4) | (x << 4);
x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2); x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2);
return ((x & 0xAA) >> 1) | ((x & 0x55) << 1); return ((x & 0xAA) >> 1) | ((x & 0x55) << 1);
#endif #endif
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Bit reverse a 16 bit word. /*! \brief Bit reverse a 16 bit word.
\param data The word to be reversed. \param data The word to be reversed.
...@@ -193,9 +177,8 @@ uint16_t make_mask16(uint16_t x); ...@@ -193,9 +177,8 @@ uint16_t make_mask16(uint16_t x);
\return The word with the single set bit. */ \return The word with the single set bit. */
static __inline__ uint32_t least_significant_one32(uint32_t x) static __inline__ uint32_t least_significant_one32(uint32_t x)
{ {
return (x & (-(int32_t) x)); return (x & (-(int32_t) x));
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Find the most significant one in a word, and return a word /*! \brief Find the most significant one in a word, and return a word
with just that bit set. with just that bit set.
...@@ -204,50 +187,42 @@ static __inline__ uint32_t least_significant_one32(uint32_t x) ...@@ -204,50 +187,42 @@ static __inline__ uint32_t least_significant_one32(uint32_t x)
static __inline__ uint32_t most_significant_one32(uint32_t x) static __inline__ uint32_t most_significant_one32(uint32_t x)
{ {
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
return 1 << top_bit(x); return 1 << top_bit(x);
#else #else
x = make_mask32(x); x = make_mask32(x);
return (x ^ (x >> 1)); return (x ^ (x >> 1));
#endif #endif
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Find the parity of a byte. /*! \brief Find the parity of a byte.
\param x The byte to be checked. \param x The byte to be checked.
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity8(uint8_t x) static __inline__ int parity8(uint8_t x)
{ {
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Find the parity of a 16 bit word. /*! \brief Find the parity of a 16 bit word.
\param x The word to be checked. \param x The word to be checked.
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity16(uint16_t x) static __inline__ int parity16(uint16_t x)
{ {
x ^= (x >> 8); x ^= (x >> 8);
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
/*- End of function --------------------------------------------------------*/
/*! \brief Find the parity of a 32 bit word. /*! \brief Find the parity of a 32 bit word.
\param x The word to be checked. \param x The word to be checked.
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity32(uint32_t x) static __inline__ int parity32(uint32_t x)
{ {
x ^= (x >> 16); x ^= (x >> 16);
x ^= (x >> 8); x ^= (x >> 8);
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
/*- End of function --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif #endif
/*- End of file ------------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/
此差异已折叠。
...@@ -118,23 +118,14 @@ a minor burden. ...@@ -118,23 +118,14 @@ a minor burden.
*/ */
#include "fir.h" #include "fir.h"
#include "oslec.h"
/* Mask bits for the adaption mode */
#define ECHO_CAN_USE_ADAPTION 0x01
#define ECHO_CAN_USE_NLP 0x02
#define ECHO_CAN_USE_CNG 0x04
#define ECHO_CAN_USE_CLIP 0x08
#define ECHO_CAN_USE_TX_HPF 0x10
#define ECHO_CAN_USE_RX_HPF 0x20
#define ECHO_CAN_DISABLE 0x40
/*! /*!
G.168 echo canceller descriptor. This defines the working state for a line G.168 echo canceller descriptor. This defines the working state for a line
echo canceller. echo canceller.
*/ */
typedef struct struct oslec_state {
{ int16_t tx, rx;
int16_t tx,rx;
int16_t clean; int16_t clean;
int16_t clean_nlp; int16_t clean_nlp;
...@@ -176,45 +167,6 @@ typedef struct ...@@ -176,45 +167,6 @@ typedef struct
/* snapshot sample of coeffs used for development */ /* snapshot sample of coeffs used for development */
int16_t *snapshot; int16_t *snapshot;
} echo_can_state_t; };
/*! Create a voice echo canceller context.
\param len The length of the canceller, in samples.
\return The new canceller context, or NULL if the canceller could not be created.
*/
echo_can_state_t *echo_can_create(int len, int adaption_mode);
/*! Free a voice echo canceller context.
\param ec The echo canceller context.
*/
void echo_can_free(echo_can_state_t *ec);
/*! Flush (reinitialise) a voice echo canceller context.
\param ec The echo canceller context.
*/
void echo_can_flush(echo_can_state_t *ec);
/*! Set the adaption mode of a voice echo canceller context.
\param ec The echo canceller context.
\param adapt The mode.
*/
void echo_can_adaption_mode(echo_can_state_t *ec, int adaption_mode);
void echo_can_snapshot(echo_can_state_t *ec);
/*! Process a sample through a voice echo canceller.
\param ec The echo canceller context.
\param tx The transmitted audio sample.
\param rx The received audio sample.
\return The clean (echo cancelled) received sample.
*/
int16_t echo_can_update(echo_can_state_t *ec, int16_t tx, int16_t rx);
/*! Process to high pass filter the tx signal.
\param ec The echo canceller context.
\param tx The transmitted auio sample.
\return The HP filtered transmit sample, send this to your D/A.
*/
int16_t echo_can_hpf_tx(echo_can_state_t *ec, int16_t tx);
#endif /* __ECHO_H */ #endif /* __ECHO_H */
...@@ -72,8 +72,7 @@ ...@@ -72,8 +72,7 @@
16 bit integer FIR descriptor. This defines the working state for a single 16 bit integer FIR descriptor. This defines the working state for a single
instance of an FIR filter using 16 bit integer coefficients. instance of an FIR filter using 16 bit integer coefficients.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const int16_t *coeffs; const int16_t *coeffs;
...@@ -85,8 +84,7 @@ typedef struct ...@@ -85,8 +84,7 @@ typedef struct
instance of an FIR filter using 32 bit integer coefficients, and filtering instance of an FIR filter using 32 bit integer coefficients, and filtering
16 bit integer data. 16 bit integer data.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const int32_t *coeffs; const int32_t *coeffs;
...@@ -97,273 +95,201 @@ typedef struct ...@@ -97,273 +95,201 @@ typedef struct
Floating point FIR descriptor. This defines the working state for a single Floating point FIR descriptor. This defines the working state for a single
instance of an FIR filter using floating point coefficients and data. instance of an FIR filter using floating point coefficients and data.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const float *coeffs; const float *coeffs;
float *history; float *history;
} fir_float_state_t; } fir_float_state_t;
#ifdef __cplusplus static __inline__ const int16_t *fir16_create(fir16_state_t * fir,
extern "C" { const int16_t * coeffs, int taps)
#endif
static __inline__ const int16_t *fir16_create(fir16_state_t *fir,
const int16_t *coeffs,
int taps)
{ {
fir->taps = taps; fir->taps = taps;
fir->curr_pos = taps - 1; fir->curr_pos = taps - 1;
fir->coeffs = coeffs; fir->coeffs = coeffs;
#if defined(USE_MMX) || defined(USE_SSE2) || defined(__BLACKFIN_ASM__) #if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__)
if ((fir->history = malloc(2*taps*sizeof(int16_t)))) fir->history = kcalloc(2 * taps, sizeof(int16_t), GFP_KERNEL);
memset(fir->history, 0, 2*taps*sizeof(int16_t));
#else #else
if ((fir->history = (int16_t *) malloc(taps*sizeof(int16_t)))) fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL);
memset(fir->history, 0, taps*sizeof(int16_t));
#endif #endif
return fir->history; return fir->history;
} }
/*- End of function --------------------------------------------------------*/
static __inline__ void fir16_flush(fir16_state_t *fir) static __inline__ void fir16_flush(fir16_state_t * fir)
{ {
#if defined(USE_MMX) || defined(USE_SSE2) || defined(__BLACKFIN_ASM__) #if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__)
memset(fir->history, 0, 2*fir->taps*sizeof(int16_t)); memset(fir->history, 0, 2 * fir->taps * sizeof(int16_t));
#else #else
memset(fir->history, 0, fir->taps*sizeof(int16_t)); memset(fir->history, 0, fir->taps * sizeof(int16_t));
#endif #endif
} }
/*- End of function --------------------------------------------------------*/
static __inline__ void fir16_free(fir16_state_t *fir) static __inline__ void fir16_free(fir16_state_t * fir)
{ {
free(fir->history); kfree(fir->history);
} }
/*- End of function --------------------------------------------------------*/
#ifdef __BLACKFIN_ASM__ #ifdef __bfin__
static inline int32_t dot_asm(short *x, short *y, int len) static inline int32_t dot_asm(short *x, short *y, int len)
{ {
int dot; int dot;
len--; len--;
__asm__ __asm__("I0 = %1;\n\t"
( "I1 = %2;\n\t"
"I0 = %1;\n\t" "A0 = 0;\n\t"
"I1 = %2;\n\t" "R0.L = W[I0++] || R1.L = W[I1++];\n\t"
"A0 = 0;\n\t" "LOOP dot%= LC0 = %3;\n\t"
"R0.L = W[I0++] || R1.L = W[I1++];\n\t" "LOOP_BEGIN dot%=;\n\t"
"LOOP dot%= LC0 = %3;\n\t" "A0 += R0.L * R1.L (IS) || R0.L = W[I0++] || R1.L = W[I1++];\n\t"
"LOOP_BEGIN dot%=;\n\t" "LOOP_END dot%=;\n\t"
"A0 += R0.L * R1.L (IS) || R0.L = W[I0++] || R1.L = W[I1++];\n\t" "A0 += R0.L*R1.L (IS);\n\t"
"LOOP_END dot%=;\n\t" "R0 = A0;\n\t"
"A0 += R0.L*R1.L (IS);\n\t" "%0 = R0;\n\t"
"R0 = A0;\n\t" :"=&d"(dot)
"%0 = R0;\n\t" :"a"(x), "a"(y), "a"(len)
: "=&d" (dot) :"I0", "I1", "A1", "A0", "R0", "R1"
: "a" (x), "a" (y), "a" (len) );
: "I0", "I1", "A1", "A0", "R0", "R1"
); return dot;
return dot;
} }
#endif #endif
/*- End of function --------------------------------------------------------*/
static __inline__ int16_t fir16(fir16_state_t *fir, int16_t sample) static __inline__ int16_t fir16(fir16_state_t * fir, int16_t sample)
{ {
int32_t y; int32_t y;
#if defined(USE_MMX) #if defined(USE_MMX)
int i; int i;
mmx_t *mmx_coeffs; mmx_t *mmx_coeffs;
mmx_t *mmx_hist; mmx_t *mmx_hist;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
mmx_coeffs = (mmx_t *) fir->coeffs; mmx_coeffs = (mmx_t *) fir->coeffs;
mmx_hist = (mmx_t *) &fir->history[fir->curr_pos]; mmx_hist = (mmx_t *) & fir->history[fir->curr_pos];
i = fir->taps; i = fir->taps;
pxor_r2r(mm4, mm4); pxor_r2r(mm4, mm4);
/* 8 samples per iteration, so the filter must be a multiple of 8 long. */ /* 8 samples per iteration, so the filter must be a multiple of 8 long. */
while (i > 0) while (i > 0) {
{ movq_m2r(mmx_coeffs[0], mm0);
movq_m2r(mmx_coeffs[0], mm0); movq_m2r(mmx_coeffs[1], mm2);
movq_m2r(mmx_coeffs[1], mm2); movq_m2r(mmx_hist[0], mm1);
movq_m2r(mmx_hist[0], mm1); movq_m2r(mmx_hist[1], mm3);
movq_m2r(mmx_hist[1], mm3); mmx_coeffs += 2;
mmx_coeffs += 2; mmx_hist += 2;
mmx_hist += 2; pmaddwd_r2r(mm1, mm0);
pmaddwd_r2r(mm1, mm0); pmaddwd_r2r(mm3, mm2);
pmaddwd_r2r(mm3, mm2); paddd_r2r(mm0, mm4);
paddd_r2r(mm0, mm4); paddd_r2r(mm2, mm4);
paddd_r2r(mm2, mm4); i -= 8;
i -= 8; }
} movq_r2r(mm4, mm0);
movq_r2r(mm4, mm0); psrlq_i2r(32, mm0);
psrlq_i2r(32, mm0); paddd_r2r(mm0, mm4);
paddd_r2r(mm0, mm4); movd_r2m(mm4, y);
movd_r2m(mm4, y); emms();
emms();
#elif defined(USE_SSE2) #elif defined(USE_SSE2)
int i; int i;
xmm_t *xmm_coeffs; xmm_t *xmm_coeffs;
xmm_t *xmm_hist; xmm_t *xmm_hist;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
xmm_coeffs = (xmm_t *) fir->coeffs; xmm_coeffs = (xmm_t *) fir->coeffs;
xmm_hist = (xmm_t *) &fir->history[fir->curr_pos]; xmm_hist = (xmm_t *) & fir->history[fir->curr_pos];
i = fir->taps; i = fir->taps;
pxor_r2r(xmm4, xmm4); pxor_r2r(xmm4, xmm4);
/* 16 samples per iteration, so the filter must be a multiple of 16 long. */ /* 16 samples per iteration, so the filter must be a multiple of 16 long. */
while (i > 0) while (i > 0) {
{ movdqu_m2r(xmm_coeffs[0], xmm0);
movdqu_m2r(xmm_coeffs[0], xmm0); movdqu_m2r(xmm_coeffs[1], xmm2);
movdqu_m2r(xmm_coeffs[1], xmm2); movdqu_m2r(xmm_hist[0], xmm1);
movdqu_m2r(xmm_hist[0], xmm1); movdqu_m2r(xmm_hist[1], xmm3);
movdqu_m2r(xmm_hist[1], xmm3); xmm_coeffs += 2;
xmm_coeffs += 2; xmm_hist += 2;
xmm_hist += 2; pmaddwd_r2r(xmm1, xmm0);
pmaddwd_r2r(xmm1, xmm0); pmaddwd_r2r(xmm3, xmm2);
pmaddwd_r2r(xmm3, xmm2); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); paddd_r2r(xmm2, xmm4);
paddd_r2r(xmm2, xmm4); i -= 16;
i -= 16; }
} movdqa_r2r(xmm4, xmm0);
movdqa_r2r(xmm4, xmm0); psrldq_i2r(8, xmm0);
psrldq_i2r(8, xmm0); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); movdqa_r2r(xmm4, xmm0);
movdqa_r2r(xmm4, xmm0); psrldq_i2r(4, xmm0);
psrldq_i2r(4, xmm0); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); movd_r2m(xmm4, y);
movd_r2m(xmm4, y); #elif defined(__bfin__)
#elif defined(__BLACKFIN_ASM__) fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; y = dot_asm((int16_t *) fir->coeffs, &fir->history[fir->curr_pos],
y = dot_asm((int16_t*)fir->coeffs, &fir->history[fir->curr_pos], fir->taps); fir->taps);
#else #else
int i; int i;
int offset1; int offset1;
int offset2; int offset2;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
offset2 = fir->curr_pos; offset2 = fir->curr_pos;
offset1 = fir->taps - offset2; offset1 = fir->taps - offset2;
y = 0; y = 0;
for (i = fir->taps - 1; i >= offset1; i--) for (i = fir->taps - 1; i >= offset1; i--)
y += fir->coeffs[i]*fir->history[i - offset1]; y += fir->coeffs[i] * fir->history[i - offset1];
for ( ; i >= 0; i--) for (; i >= 0; i--)
y += fir->coeffs[i]*fir->history[i + offset2]; y += fir->coeffs[i] * fir->history[i + offset2];
#endif #endif
if (fir->curr_pos <= 0) if (fir->curr_pos <= 0)
fir->curr_pos = fir->taps; fir->curr_pos = fir->taps;
fir->curr_pos--; fir->curr_pos--;
return (int16_t) (y >> 15); return (int16_t) (y >> 15);
}
/*- End of function --------------------------------------------------------*/
static __inline__ const int16_t *fir32_create(fir32_state_t *fir,
const int32_t *coeffs,
int taps)
{
fir->taps = taps;
fir->curr_pos = taps - 1;
fir->coeffs = coeffs;
fir->history = (int16_t *) malloc(taps*sizeof(int16_t));
if (fir->history)
memset(fir->history, '\0', taps*sizeof(int16_t));
return fir->history;
}
/*- End of function --------------------------------------------------------*/
static __inline__ void fir32_flush(fir32_state_t *fir)
{
memset(fir->history, 0, fir->taps*sizeof(int16_t));
} }
/*- End of function --------------------------------------------------------*/
static __inline__ void fir32_free(fir32_state_t *fir) static __inline__ const int16_t *fir32_create(fir32_state_t * fir,
const int32_t * coeffs, int taps)
{ {
free(fir->history); fir->taps = taps;
} fir->curr_pos = taps - 1;
/*- End of function --------------------------------------------------------*/ fir->coeffs = coeffs;
fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL);
static __inline__ int16_t fir32(fir32_state_t *fir, int16_t sample) return fir->history;
{
int i;
int32_t y;
int offset1;
int offset2;
fir->history[fir->curr_pos] = sample;
offset2 = fir->curr_pos;
offset1 = fir->taps - offset2;
y = 0;
for (i = fir->taps - 1; i >= offset1; i--)
y += fir->coeffs[i]*fir->history[i - offset1];
for ( ; i >= 0; i--)
y += fir->coeffs[i]*fir->history[i + offset2];
if (fir->curr_pos <= 0)
fir->curr_pos = fir->taps;
fir->curr_pos--;
return (int16_t) (y >> 15);
} }
/*- End of function --------------------------------------------------------*/
#ifndef __KERNEL__ static __inline__ void fir32_flush(fir32_state_t * fir)
static __inline__ const float *fir_float_create(fir_float_state_t *fir,
const float *coeffs,
int taps)
{ {
fir->taps = taps; memset(fir->history, 0, fir->taps * sizeof(int16_t));
fir->curr_pos = taps - 1;
fir->coeffs = coeffs;
fir->history = (float *) malloc(taps*sizeof(float));
if (fir->history)
memset(fir->history, '\0', taps*sizeof(float));
return fir->history;
} }
/*- End of function --------------------------------------------------------*/
static __inline__ void fir_float_free(fir_float_state_t *fir) static __inline__ void fir32_free(fir32_state_t * fir)
{ {
free(fir->history); kfree(fir->history);
} }
/*- End of function --------------------------------------------------------*/
static __inline__ int16_t fir_float(fir_float_state_t *fir, int16_t sample) static __inline__ int16_t fir32(fir32_state_t * fir, int16_t sample)
{ {
int i; int i;
float y; int32_t y;
int offset1; int offset1;
int offset2; int offset2;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
offset2 = fir->curr_pos;
offset2 = fir->curr_pos; offset1 = fir->taps - offset2;
offset1 = fir->taps - offset2; y = 0;
y = 0; for (i = fir->taps - 1; i >= offset1; i--)
for (i = fir->taps - 1; i >= offset1; i--) y += fir->coeffs[i] * fir->history[i - offset1];
y += fir->coeffs[i]*fir->history[i - offset1]; for (; i >= 0; i--)
for ( ; i >= 0; i--) y += fir->coeffs[i] * fir->history[i + offset2];
y += fir->coeffs[i]*fir->history[i + offset2]; if (fir->curr_pos <= 0)
if (fir->curr_pos <= 0) fir->curr_pos = fir->taps;
fir->curr_pos = fir->taps; fir->curr_pos--;
fir->curr_pos--; return (int16_t) (y >> 15);
return (int16_t) y;
} }
/*- End of function --------------------------------------------------------*/
#endif
#ifdef __cplusplus
}
#endif
#endif #endif
/*- End of file ------------------------------------------------------------*/ /*- End of file ------------------------------------------------------------*/
...@@ -27,24 +27,23 @@ ...@@ -27,24 +27,23 @@
* values by ULL, lest they be truncated by the compiler) * values by ULL, lest they be truncated by the compiler)
*/ */
typedef union { typedef union {
long long q; /* Quadword (64-bit) value */ long long q; /* Quadword (64-bit) value */
unsigned long long uq; /* Unsigned Quadword */ unsigned long long uq; /* Unsigned Quadword */
int d[2]; /* 2 Doubleword (32-bit) values */ int d[2]; /* 2 Doubleword (32-bit) values */
unsigned int ud[2]; /* 2 Unsigned Doubleword */ unsigned int ud[2]; /* 2 Unsigned Doubleword */
short w[4]; /* 4 Word (16-bit) values */ short w[4]; /* 4 Word (16-bit) values */
unsigned short uw[4]; /* 4 Unsigned Word */ unsigned short uw[4]; /* 4 Unsigned Word */
char b[8]; /* 8 Byte (8-bit) values */ char b[8]; /* 8 Byte (8-bit) values */
unsigned char ub[8]; /* 8 Unsigned Byte */ unsigned char ub[8]; /* 8 Unsigned Byte */
float s[2]; /* Single-precision (32-bit) value */ float s[2]; /* Single-precision (32-bit) value */
} mmx_t; /* On an 8-byte (64-bit) boundary */ } mmx_t; /* On an 8-byte (64-bit) boundary */
/* SSE registers */ /* SSE registers */
typedef union { typedef union {
char b[16]; char b[16];
} xmm_t; } xmm_t;
#define mmx_i2r(op,imm,reg) \ #define mmx_i2r(op,imm,reg) \
__asm__ __volatile__ (#op " %0, %%" #reg \ __asm__ __volatile__ (#op " %0, %%" #reg \
: /* nothing */ \ : /* nothing */ \
...@@ -63,7 +62,6 @@ typedef union { ...@@ -63,7 +62,6 @@ typedef union {
#define mmx_r2r(op,regs,regd) \ #define mmx_r2r(op,regs,regd) \
__asm__ __volatile__ (#op " %" #regs ", %" #regd) __asm__ __volatile__ (#op " %" #regs ", %" #regd)
#define emms() __asm__ __volatile__ ("emms") #define emms() __asm__ __volatile__ ("emms")
#define movd_m2r(var,reg) mmx_m2r (movd, var, reg) #define movd_m2r(var,reg) mmx_m2r (movd, var, reg)
...@@ -192,16 +190,13 @@ typedef union { ...@@ -192,16 +190,13 @@ typedef union {
#define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg) #define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg)
#define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd) #define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd)
/* 3DNOW extensions */ /* 3DNOW extensions */
#define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg) #define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg)
#define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd) #define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd)
/* AMD MMX extensions - also available in intel SSE */ /* AMD MMX extensions - also available in intel SSE */
#define mmx_m2ri(op,mem,reg,imm) \ #define mmx_m2ri(op,mem,reg,imm) \
__asm__ __volatile__ (#op " %1, %0, %%" #reg \ __asm__ __volatile__ (#op " %1, %0, %%" #reg \
: /* nothing */ \ : /* nothing */ \
...@@ -216,7 +211,6 @@ typedef union { ...@@ -216,7 +211,6 @@ typedef union {
: /* nothing */ \ : /* nothing */ \
: "m" (mem)) : "m" (mem))
#define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg) #define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg)
#define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var) #define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var)
...@@ -284,5 +278,4 @@ typedef union { ...@@ -284,5 +278,4 @@ typedef union {
#define punpcklqdq_r2r(regs,regd) mmx_r2r (punpcklqdq, regs, regd) #define punpcklqdq_r2r(regs,regd) mmx_r2r (punpcklqdq, regs, regd)
#define punpckhqdq_r2r(regs,regd) mmx_r2r (punpckhqdq, regs, regd) #define punpckhqdq_r2r(regs,regd) mmx_r2r (punpckhqdq, regs, regd)
#endif /* AVCODEC_I386MMX_H */ #endif /* AVCODEC_I386MMX_H */
/*
* OSLEC - A line echo canceller. This code is being developed
* against and partially complies with G168. Using code from SpanDSP
*
* Written by Steve Underwood <steveu@coppice.org>
* and David Rowe <david_at_rowetel_dot_com>
*
* Copyright (C) 2001 Steve Underwood and 2007-2008 David Rowe
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef __OSLEC_H
#define __OSLEC_H
/* TODO: document interface */
/* Mask bits for the adaption mode */
#define ECHO_CAN_USE_ADAPTION 0x01
#define ECHO_CAN_USE_NLP 0x02
#define ECHO_CAN_USE_CNG 0x04
#define ECHO_CAN_USE_CLIP 0x08
#define ECHO_CAN_USE_TX_HPF 0x10
#define ECHO_CAN_USE_RX_HPF 0x20
#define ECHO_CAN_DISABLE 0x40
/*!
G.168 echo canceller descriptor. This defines the working state for a line
echo canceller.
*/
struct oslec_state;
/*! Create a voice echo canceller context.
\param len The length of the canceller, in samples.
\return The new canceller context, or NULL if the canceller could not be created.
*/
struct oslec_state *oslec_create(int len, int adaption_mode);
/*! Free a voice echo canceller context.
\param ec The echo canceller context.
*/
void oslec_free(struct oslec_state *ec);
/*! Flush (reinitialise) a voice echo canceller context.
\param ec The echo canceller context.
*/
void oslec_flush(struct oslec_state *ec);
/*! Set the adaption mode of a voice echo canceller context.
\param ec The echo canceller context.
\param adapt The mode.
*/
void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode);
void oslec_snapshot(struct oslec_state *ec);
/*! Process a sample through a voice echo canceller.
\param ec The echo canceller context.
\param tx The transmitted audio sample.
\param rx The received audio sample.
\return The clean (echo cancelled) received sample.
*/
int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx);
/*! Process to high pass filter the tx signal.
\param ec The echo canceller context.
\param tx The transmitted auio sample.
\return The HP filtered transmit sample, send this to your D/A.
*/
int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx);
#endif /* __OSLEC_H */
...@@ -84,7 +84,6 @@ ...@@ -84,7 +84,6 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/delay.h>
#include "et1310_phy.h" #include "et1310_phy.h"
#include "et1310_pm.h" #include "et1310_pm.h"
...@@ -95,7 +94,6 @@ ...@@ -95,7 +94,6 @@
#include "et131x_initpci.h" #include "et131x_initpci.h"
#include "et1310_address_map.h" #include "et1310_address_map.h"
#include "et1310_jagcore.h"
#include "et1310_tx.h" #include "et1310_tx.h"
#include "et1310_rx.h" #include "et1310_rx.h"
#include "et1310_mac.h" #include "et1310_mac.h"
......
...@@ -97,7 +97,6 @@ ...@@ -97,7 +97,6 @@
#include "et131x_isr.h" #include "et131x_isr.h"
#include "et1310_address_map.h" #include "et1310_address_map.h"
#include "et1310_jagcore.h"
#include "et1310_tx.h" #include "et1310_tx.h"
#include "et1310_rx.h" #include "et1310_rx.h"
#include "et1310_mac.h" #include "et1310_mac.h"
......
...@@ -97,7 +97,6 @@ ...@@ -97,7 +97,6 @@
#include "et131x_isr.h" #include "et131x_isr.h"
#include "et1310_address_map.h" #include "et1310_address_map.h"
#include "et1310_jagcore.h"
#include "et1310_tx.h" #include "et1310_tx.h"
#include "et1310_rx.h" #include "et1310_rx.h"
#include "et1310_mac.h" #include "et1310_mac.h"
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/sched.h> #include <linux/sched.h>
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
* Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
*/ */
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/wait.h> #include <linux/wait.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/tuner.h> #include <media/tuner.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/version.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/tvaudio.h> #include <media/tvaudio.h>
......
此差异已折叠。
...@@ -329,46 +329,46 @@ ...@@ -329,46 +329,46 @@
Circular buffer used for analog input/output reads/writes. Circular buffer used for analog input/output reads/writes.
===========================================================================*/ ===========================================================================*/
typedef struct me4000_circ_buf { struct me4000_circ_buf {
s16 *buf; s16 *buf;
int volatile head; int volatile head;
int volatile tail; int volatile tail;
} me4000_circ_buf_t; };
/*============================================================================= /*=============================================================================
Information about the hardware capabilities Information about the hardware capabilities
===========================================================================*/ ===========================================================================*/
typedef struct me4000_ao_info { struct me4000_ao_info {
int count; int count;
int fifo_count; int fifo_count;
} me4000_ao_info_t; };
typedef struct me4000_ai_info { struct me4000_ai_info {
int count; int count;
int sh_count; int sh_count;
int diff_count; int diff_count;
int ex_trig_analog; int ex_trig_analog;
} me4000_ai_info_t; };
typedef struct me4000_dio_info { struct me4000_dio_info {
int count; int count;
} me4000_dio_info_t; };
typedef struct me4000_cnt_info { struct me4000_cnt_info {
int count; int count;
} me4000_cnt_info_t; };
typedef struct me4000_board { struct me4000_board {
u16 vendor_id; u16 vendor_id;
u16 device_id; u16 device_id;
me4000_ao_info_t ao; struct me4000_ao_info ao;
me4000_ai_info_t ai; struct me4000_ai_info ai;
me4000_dio_info_t dio; struct me4000_dio_info dio;
me4000_cnt_info_t cnt; struct me4000_cnt_info cnt;
} me4000_board_t; };
static me4000_board_t me4000_boards[] = { static struct me4000_board me4000_boards[] = {
{PCI_VENDOR_ID_MEILHAUS, 0x4610, {0, 0}, {16, 0, 0, 0}, {4}, {3}}, {PCI_VENDOR_ID_MEILHAUS, 0x4610, {0, 0}, {16, 0, 0, 0}, {4}, {3}},
{PCI_VENDOR_ID_MEILHAUS, 0x4650, {0, 0}, {16, 0, 0, 0}, {4}, {0}}, {PCI_VENDOR_ID_MEILHAUS, 0x4650, {0, 0}, {16, 0, 0, 0}, {4}, {0}},
...@@ -391,8 +391,6 @@ static me4000_board_t me4000_boards[] = { ...@@ -391,8 +391,6 @@ static me4000_board_t me4000_boards[] = {
{0}, {0},
}; };
#define ME4000_BOARD_VERSIONS (sizeof(me4000_boards) / sizeof(me4000_board_t) - 1)
/*============================================================================= /*=============================================================================
PCI device table. PCI device table.
This is used by modprobe to translate PCI IDs to drivers. This is used by modprobe to translate PCI IDs to drivers.
...@@ -427,19 +425,19 @@ MODULE_DEVICE_TABLE(pci, me4000_pci_table); ...@@ -427,19 +425,19 @@ MODULE_DEVICE_TABLE(pci, me4000_pci_table);
Global board and subdevice information structures Global board and subdevice information structures
===========================================================================*/ ===========================================================================*/
typedef struct me4000_info { struct me4000_info {
struct list_head list; // List of all detected boards struct list_head list; // List of all detected boards
int board_count; // Index of the board after detection int board_count; // Index of the board after detection
unsigned long plx_regbase; // PLX configuration space base address unsigned long plx_regbase; // PLX configuration space base address
unsigned long me4000_regbase; // Base address of the ME4000 resource_size_t me4000_regbase; // Base address of the ME4000
unsigned long timer_regbase; // Base address of the timer circuit resource_size_t timer_regbase; // Base address of the timer circuit
unsigned long program_regbase; // Base address to set the program pin for the xilinx resource_size_t program_regbase; // Base address to set the program pin for the xilinx
unsigned long plx_regbase_size; // PLX register set space unsigned long plx_regbase_size; // PLX register set space
unsigned long me4000_regbase_size; // ME4000 register set space resource_size_t me4000_regbase_size; // ME4000 register set space
unsigned long timer_regbase_size; // Timer circuit register set space resource_size_t timer_regbase_size; // Timer circuit register set space
unsigned long program_regbase_size; // Size of program base address of the ME4000 resource_size_t program_regbase_size; // Size of program base address of the ME4000
unsigned int serial_no; // Serial number of the board unsigned int serial_no; // Serial number of the board
unsigned char hw_revision; // Hardware revision of the board unsigned char hw_revision; // Hardware revision of the board
...@@ -451,7 +449,7 @@ typedef struct me4000_info { ...@@ -451,7 +449,7 @@ typedef struct me4000_info {
int pci_func_no; // PCI function number int pci_func_no; // PCI function number
struct pci_dev *pci_dev_p; // General PCI information struct pci_dev *pci_dev_p; // General PCI information
me4000_board_t *board_p; // Holds the board capabilities struct me4000_board *board_p; // Holds the board capabilities
unsigned int irq; // IRQ assigned from the PCI BIOS unsigned int irq; // IRQ assigned from the PCI BIOS
unsigned int irq_count; // Count of external interrupts unsigned int irq_count; // Count of external interrupts
...@@ -464,18 +462,18 @@ typedef struct me4000_info { ...@@ -464,18 +462,18 @@ typedef struct me4000_info {
struct me4000_dio_context *dio_context; // Digital I/O specific context struct me4000_dio_context *dio_context; // Digital I/O specific context
struct me4000_cnt_context *cnt_context; // Counter specific context struct me4000_cnt_context *cnt_context; // Counter specific context
struct me4000_ext_int_context *ext_int_context; // External interrupt specific context struct me4000_ext_int_context *ext_int_context; // External interrupt specific context
} me4000_info_t; };
typedef struct me4000_ao_context { struct me4000_ao_context {
struct list_head list; // linked list of me4000_ao_context_t struct list_head list; // linked list of me4000_ao_context_t
int index; // Index in the list int index; // Index in the list
int mode; // Indicates mode (0 = single, 1 = wraparound, 2 = continous) int mode; // Indicates mode (0 = single, 1 = wraparound, 2 = continous)
int dac_in_use; // Indicates if already opend int dac_in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
spinlock_t int_lock; // Used when locking out interrupts spinlock_t int_lock; // Used when locking out interrupts
me4000_circ_buf_t circ_buf; // Circular buffer struct me4000_circ_buf circ_buf; // Circular buffer
wait_queue_head_t wait_queue; // Wait queue to sleep while blocking write wait_queue_head_t wait_queue; // Wait queue to sleep while blocking write
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned int irq; // The irq associated with this ADC unsigned int irq; // The irq associated with this ADC
int volatile pipe_flag; // Indicates broken pipe set from me4000_ao_isr() int volatile pipe_flag; // Indicates broken pipe set from me4000_ao_isr()
unsigned long ctrl_reg; unsigned long ctrl_reg;
...@@ -486,9 +484,9 @@ typedef struct me4000_ao_context { ...@@ -486,9 +484,9 @@ typedef struct me4000_ao_context {
unsigned long irq_status_reg; unsigned long irq_status_reg;
unsigned long preload_reg; unsigned long preload_reg;
struct fasync_struct *fasync_p; // Queue for asynchronous notification struct fasync_struct *fasync_p; // Queue for asynchronous notification
} me4000_ao_context_t; };
typedef struct me4000_ai_context { struct me4000_ai_context {
struct list_head list; // linked list of me4000_ai_info_t struct list_head list; // linked list of me4000_ai_info_t
int mode; // Indicates mode int mode; // Indicates mode
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
...@@ -496,9 +494,9 @@ typedef struct me4000_ai_context { ...@@ -496,9 +494,9 @@ typedef struct me4000_ai_context {
spinlock_t int_lock; // Used when locking out interrupts spinlock_t int_lock; // Used when locking out interrupts
int number; // Number of the DAC int number; // Number of the DAC
unsigned int irq; // The irq associated with this ADC unsigned int irq; // The irq associated with this ADC
me4000_circ_buf_t circ_buf; // Circular buffer struct me4000_circ_buf circ_buf; // Circular buffer
wait_queue_head_t wait_queue; // Wait queue to sleep while blocking read wait_queue_head_t wait_queue; // Wait queue to sleep while blocking read
me4000_info_t *board_info; struct me4000_info *board_info;
struct fasync_struct *fasync_p; // Queue for asynchronous notification struct fasync_struct *fasync_p; // Queue for asynchronous notification
...@@ -523,48 +521,48 @@ typedef struct me4000_ai_context { ...@@ -523,48 +521,48 @@ typedef struct me4000_ai_context {
unsigned long channel_list_count; unsigned long channel_list_count;
unsigned long sample_counter; unsigned long sample_counter;
int sample_counter_reload; int sample_counter_reload;
} me4000_ai_context_t; };
typedef struct me4000_dio_context { struct me4000_dio_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
int dio_count; int dio_count;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned long dir_reg; unsigned long dir_reg;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long port_0_reg; unsigned long port_0_reg;
unsigned long port_1_reg; unsigned long port_1_reg;
unsigned long port_2_reg; unsigned long port_2_reg;
unsigned long port_3_reg; unsigned long port_3_reg;
} me4000_dio_context_t; };
typedef struct me4000_cnt_context { struct me4000_cnt_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
int cnt_count; int cnt_count;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long counter_0_reg; unsigned long counter_0_reg;
unsigned long counter_1_reg; unsigned long counter_1_reg;
unsigned long counter_2_reg; unsigned long counter_2_reg;
} me4000_cnt_context_t; };
typedef struct me4000_ext_int_context { struct me4000_ext_int_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned int irq; unsigned int irq;
unsigned long int_count; unsigned long int_count;
struct fasync_struct *fasync_ptr; struct fasync_struct *fasync_ptr;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long irq_status_reg; unsigned long irq_status_reg;
} me4000_ext_int_context_t; };
#endif #endif
...@@ -745,12 +743,12 @@ typedef struct me4000_ext_int_context { ...@@ -745,12 +743,12 @@ typedef struct me4000_ext_int_context {
General type definitions General type definitions
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_user_info { struct me4000_user_info {
int board_count; // Index of the board after detection int board_count; // Index of the board after detection
unsigned long plx_regbase; // PLX configuration space base address unsigned long plx_regbase; // PLX configuration space base address
unsigned long me4000_regbase; // Base address of the ME4000 resource_size_t me4000_regbase; // Base address of the ME4000
unsigned long plx_regbase_size; // PLX register set space unsigned long plx_regbase_size; // PLX register set space
unsigned long me4000_regbase_size; // ME4000 register set space resource_size_t me4000_regbase_size; // ME4000 register set space
unsigned long serial_no; // Serial number of the board unsigned long serial_no; // Serial number of the board
unsigned char hw_revision; // Hardware revision of the board unsigned char hw_revision; // Hardware revision of the board
unsigned short vendor_id; // Meilhaus vendor id (0x1402) unsigned short vendor_id; // Meilhaus vendor id (0x1402)
...@@ -773,62 +771,62 @@ typedef struct me4000_user_info { ...@@ -773,62 +771,62 @@ typedef struct me4000_user_info {
int dio_count; // Count of digital I/O ports int dio_count; // Count of digital I/O ports
int cnt_count; // Count of counters int cnt_count; // Count of counters
} me4000_user_info_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for analog output Type definitions for analog output
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_ao_channel_list { struct me4000_ao_channel_list {
unsigned long count; unsigned long count;
unsigned long *list; unsigned long *list;
} me4000_ao_channel_list_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for analog input Type definitions for analog input
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_ai_channel_list { struct me4000_ai_channel_list {
unsigned long count; unsigned long count;
unsigned long *list; unsigned long *list;
} me4000_ai_channel_list_t; };
typedef struct me4000_ai_timer { struct me4000_ai_timer {
unsigned long pre_chan; unsigned long pre_chan;
unsigned long chan; unsigned long chan;
unsigned long scan_low; unsigned long scan_low;
unsigned long scan_high; unsigned long scan_high;
} me4000_ai_timer_t; };
typedef struct me4000_ai_config { struct me4000_ai_config {
me4000_ai_timer_t timer; struct me4000_ai_timer timer;
me4000_ai_channel_list_t channel_list; struct me4000_ai_channel_list channel_list;
int sh; int sh;
} me4000_ai_config_t; };
typedef struct me4000_ai_single { struct me4000_ai_single {
int channel; int channel;
int range; int range;
int mode; int mode;
short value; short value;
unsigned long timeout; unsigned long timeout;
} me4000_ai_single_t; };
typedef struct me4000_ai_trigger { struct me4000_ai_trigger {
int mode; int mode;
int edge; int edge;
} me4000_ai_trigger_t; };
typedef struct me4000_ai_sc { struct me4000_ai_sc {
unsigned long value; unsigned long value;
int reload; int reload;
} me4000_ai_sc_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for eeprom Type definitions for eeprom
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_eeprom { struct me4000_eeprom {
unsigned long date; unsigned long date;
short uni_10_offset; short uni_10_offset;
short uni_10_fullscale; short uni_10_fullscale;
...@@ -842,45 +840,45 @@ typedef struct me4000_eeprom { ...@@ -842,45 +840,45 @@ typedef struct me4000_eeprom {
short diff_10_fullscale; short diff_10_fullscale;
short diff_2_5_offset; short diff_2_5_offset;
short diff_2_5_fullscale; short diff_2_5_fullscale;
} me4000_eeprom_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for digital I/O Type definitions for digital I/O
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_dio_config { struct me4000_dio_config {
int port; int port;
int mode; int mode;
int function; int function;
} me4000_dio_config_t; };
typedef struct me4000_dio_byte { struct me4000_dio_byte {
int port; int port;
unsigned char byte; unsigned char byte;
} me4000_dio_byte_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for counters Type definitions for counters
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_cnt { struct me4000_cnt {
int counter; int counter;
unsigned short value; unsigned short value;
} me4000_cnt_t; };
typedef struct me4000_cnt_config { struct me4000_cnt_config {
int counter; int counter;
int mode; int mode;
} me4000_cnt_config_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for external interrupt Type definitions for external interrupt
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct { struct me4000_int {
int int1_count; int int1_count;
int int2_count; int int2_count;
} me4000_int_type; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
The ioctls of the board The ioctls of the board
...@@ -888,7 +886,8 @@ typedef struct { ...@@ -888,7 +886,8 @@ typedef struct {
#define ME4000_IOCTL_MAXNR 50 #define ME4000_IOCTL_MAXNR 50
#define ME4000_MAGIC 'y' #define ME4000_MAGIC 'y'
#define ME4000_GET_USER_INFO _IOR (ME4000_MAGIC, 0, me4000_user_info_t) #define ME4000_GET_USER_INFO _IOR (ME4000_MAGIC, 0, \
struct me4000_user_info)
#define ME4000_AO_START _IOW (ME4000_MAGIC, 1, unsigned long) #define ME4000_AO_START _IOW (ME4000_MAGIC, 1, unsigned long)
#define ME4000_AO_STOP _IO (ME4000_MAGIC, 2) #define ME4000_AO_STOP _IO (ME4000_MAGIC, 2)
...@@ -904,25 +903,35 @@ typedef struct { ...@@ -904,25 +903,35 @@ typedef struct {
#define ME4000_AO_DISABLE_DO _IO (ME4000_MAGIC, 12) #define ME4000_AO_DISABLE_DO _IO (ME4000_MAGIC, 12)
#define ME4000_AO_FSM_STATE _IOR (ME4000_MAGIC, 13, int) #define ME4000_AO_FSM_STATE _IOR (ME4000_MAGIC, 13, int)
#define ME4000_AI_SINGLE _IOR (ME4000_MAGIC, 14, me4000_ai_single_t) #define ME4000_AI_SINGLE _IOR (ME4000_MAGIC, 14, \
struct me4000_ai_single)
#define ME4000_AI_START _IOW (ME4000_MAGIC, 15, unsigned long) #define ME4000_AI_START _IOW (ME4000_MAGIC, 15, unsigned long)
#define ME4000_AI_STOP _IO (ME4000_MAGIC, 16) #define ME4000_AI_STOP _IO (ME4000_MAGIC, 16)
#define ME4000_AI_IMMEDIATE_STOP _IO (ME4000_MAGIC, 17) #define ME4000_AI_IMMEDIATE_STOP _IO (ME4000_MAGIC, 17)
#define ME4000_AI_EX_TRIG_ENABLE _IO (ME4000_MAGIC, 18) #define ME4000_AI_EX_TRIG_ENABLE _IO (ME4000_MAGIC, 18)
#define ME4000_AI_EX_TRIG_DISABLE _IO (ME4000_MAGIC, 19) #define ME4000_AI_EX_TRIG_DISABLE _IO (ME4000_MAGIC, 19)
#define ME4000_AI_EX_TRIG_SETUP _IOW (ME4000_MAGIC, 20, me4000_ai_trigger_t) #define ME4000_AI_EX_TRIG_SETUP _IOW (ME4000_MAGIC, 20, \
#define ME4000_AI_CONFIG _IOW (ME4000_MAGIC, 21, me4000_ai_config_t) struct me4000_ai_trigger)
#define ME4000_AI_SC_SETUP _IOW (ME4000_MAGIC, 22, me4000_ai_sc_t) #define ME4000_AI_CONFIG _IOW (ME4000_MAGIC, 21, \
struct me4000_ai_config)
#define ME4000_AI_SC_SETUP _IOW (ME4000_MAGIC, 22, \
struct me4000_ai_sc)
#define ME4000_AI_FSM_STATE _IOR (ME4000_MAGIC, 23, int) #define ME4000_AI_FSM_STATE _IOR (ME4000_MAGIC, 23, int)
#define ME4000_DIO_CONFIG _IOW (ME4000_MAGIC, 24, me4000_dio_config_t) #define ME4000_DIO_CONFIG _IOW (ME4000_MAGIC, 24, \
#define ME4000_DIO_GET_BYTE _IOR (ME4000_MAGIC, 25, me4000_dio_byte_t) struct me4000_dio_config)
#define ME4000_DIO_SET_BYTE _IOW (ME4000_MAGIC, 26, me4000_dio_byte_t) #define ME4000_DIO_GET_BYTE _IOR (ME4000_MAGIC, 25, \
struct me4000_dio_byte)
#define ME4000_DIO_SET_BYTE _IOW (ME4000_MAGIC, 26, \
struct me4000_dio_byte)
#define ME4000_DIO_RESET _IO (ME4000_MAGIC, 27) #define ME4000_DIO_RESET _IO (ME4000_MAGIC, 27)
#define ME4000_CNT_READ _IOR (ME4000_MAGIC, 28, me4000_cnt_t) #define ME4000_CNT_READ _IOR (ME4000_MAGIC, 28, \
#define ME4000_CNT_WRITE _IOW (ME4000_MAGIC, 29, me4000_cnt_t) struct me4000_cnt)
#define ME4000_CNT_CONFIG _IOW (ME4000_MAGIC, 30, me4000_cnt_config_t) #define ME4000_CNT_WRITE _IOW (ME4000_MAGIC, 29, \
struct me4000_cnt)
#define ME4000_CNT_CONFIG _IOW (ME4000_MAGIC, 30, \
struct me4000_cnt_config)
#define ME4000_CNT_RESET _IO (ME4000_MAGIC, 31) #define ME4000_CNT_RESET _IO (ME4000_MAGIC, 31)
#define ME4000_EXT_INT_DISABLE _IO (ME4000_MAGIC, 32) #define ME4000_EXT_INT_DISABLE _IO (ME4000_MAGIC, 32)
...@@ -934,13 +943,16 @@ typedef struct { ...@@ -934,13 +943,16 @@ typedef struct {
#define ME4000_AI_FULLSCALE_ENABLE _IO (ME4000_MAGIC, 37) #define ME4000_AI_FULLSCALE_ENABLE _IO (ME4000_MAGIC, 37)
#define ME4000_AI_FULLSCALE_DISABLE _IO (ME4000_MAGIC, 38) #define ME4000_AI_FULLSCALE_DISABLE _IO (ME4000_MAGIC, 38)
#define ME4000_AI_EEPROM_READ _IOR (ME4000_MAGIC, 39, me4000_eeprom_t) #define ME4000_AI_EEPROM_READ _IOR (ME4000_MAGIC, 39, \
#define ME4000_AI_EEPROM_WRITE _IOW (ME4000_MAGIC, 40, me4000_eeprom_t) struct me4000_eeprom)
#define ME4000_AI_EEPROM_WRITE _IOW (ME4000_MAGIC, 40, \
struct me4000_eeprom)
#define ME4000_AO_SIMULTANEOUS_EX_TRIG _IO (ME4000_MAGIC, 41) #define ME4000_AO_SIMULTANEOUS_EX_TRIG _IO (ME4000_MAGIC, 41)
#define ME4000_AO_SIMULTANEOUS_SW _IO (ME4000_MAGIC, 42) #define ME4000_AO_SIMULTANEOUS_SW _IO (ME4000_MAGIC, 42)
#define ME4000_AO_SIMULTANEOUS_DISABLE _IO (ME4000_MAGIC, 43) #define ME4000_AO_SIMULTANEOUS_DISABLE _IO (ME4000_MAGIC, 43)
#define ME4000_AO_SIMULTANEOUS_UPDATE _IOW (ME4000_MAGIC, 44, me4000_ao_channel_list_t) #define ME4000_AO_SIMULTANEOUS_UPDATE _IOW (ME4000_MAGIC, 44, \
struct me4000_ao_channel_list)
#define ME4000_AO_SYNCHRONOUS_EX_TRIG _IO (ME4000_MAGIC, 45) #define ME4000_AO_SYNCHRONOUS_EX_TRIG _IO (ME4000_MAGIC, 45)
#define ME4000_AO_SYNCHRONOUS_SW _IO (ME4000_MAGIC, 46) #define ME4000_AO_SYNCHRONOUS_SW _IO (ME4000_MAGIC, 46)
......
config PCC_ACPI
tristate "Panasonic ACPI Hotkey support"
depends on ACPI
default n
---help---
This driver provides support for Panasonic hotkeys through the
ACPI interface. This works for the Panasonic R1 (N variant),
R2, R3, T2, W2, and Y2 laptops.
To compile this driver as a module, choose M here. The module
will be called pcc-acpi.
obj-$(CONFIG_PCC_ACPI) += pcc-acpi.o
TODO:
- Lindent fixes
- checkpatch.pl fixes
- verify that the acpi interface is correct
- remove /proc dependancy if needed (not sure yet.)
Please send any patches for this driver to Greg Kroah-Hartman <greg@kroah.com>
此差异已折叠。
config POCH
tristate "Redrapids Pocket Change CardBus support"
depends on PCI && UIO
default N
---help---
Enable support for Redrapids Pocket Change CardBus devices.
obj-$(CONFIG_POCH) += poch.o
TODO:
- fix transmit overflows
- audit userspace interfaces
- get reserved major/minor if needed
Please send patches to Greg Kroah-Hartman <greg@kroah.com> and
Vijay Kumar <vijaykumar@bravegnu.org> and Jaya Kumar <jayakumar.lkml@gmail.com>
此差异已折叠。
/*
* User-space DMA and UIO based Redrapids Pocket Change CardBus driver
*
* Copyright 2008 Vijay Kumar <vijaykumar@bravegnu.org>
*
* Part of userspace API. Should be moved to a header file in
* include/linux for final version.
*
*/
struct poch_cbuf_header {
__s32 group_size_bytes;
__s32 group_count;
__s32 group_offsets[0];
};
struct poch_counters {
__u32 fifo_empty;
__u32 fifo_overflow;
__u32 pll_unlock;
};
#define POCH_IOC_NUM '9'
#define POCH_IOC_TRANSFER_START _IO(POCH_IOC_NUM, 0)
#define POCH_IOC_TRANSFER_STOP _IO(POCH_IOC_NUM, 1)
#define POCH_IOC_GET_COUNTERS _IOR(POCH_IOC_NUM, 2, \
struct poch_counters)
#define POCH_IOC_SYNC_GROUP_FOR_USER _IO(POCH_IOC_NUM, 3)
#define POCH_IOC_SYNC_GROUP_FOR_DEVICE _IO(POCH_IOC_NUM, 4)
...@@ -54,7 +54,6 @@ ...@@ -54,7 +54,6 @@
* IS-NIC driver. * IS-NIC driver.
*/ */
#include <linux/version.h>
#define SLIC_DUMP_ENABLED 0 #define SLIC_DUMP_ENABLED 0
#define KLUDGE_FOR_4GB_BOUNDARY 1 #define KLUDGE_FOR_4GB_BOUNDARY 1
...@@ -96,17 +95,9 @@ ...@@ -96,17 +95,9 @@
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/skbuff.h>
#include <linux/string.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
...@@ -275,7 +266,6 @@ static void slic_dbg_register_trace(struct adapter *adapter, ...@@ -275,7 +266,6 @@ static void slic_dbg_register_trace(struct adapter *adapter,
card->reg_value[i], card->reg_valueh[i]); card->reg_value[i], card->reg_valueh[i]);
} }
} }
}
#endif #endif
static void slic_init_adapter(struct net_device *netdev, static void slic_init_adapter(struct net_device *netdev,
...@@ -606,6 +596,7 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev) ...@@ -606,6 +596,7 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev)
uint mmio_len = 0; uint mmio_len = 0;
struct adapter *adapter = (struct adapter *) netdev_priv(dev); struct adapter *adapter = (struct adapter *) netdev_priv(dev);
struct sliccard *card; struct sliccard *card;
struct mcast_address *mcaddr, *mlist;
ASSERT(adapter); ASSERT(adapter);
DBG_MSG("slicoss: %s ENTER dev[%p] adapter[%p]\n", __func__, dev, DBG_MSG("slicoss: %s ENTER dev[%p] adapter[%p]\n", __func__, dev,
...@@ -625,6 +616,13 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev) ...@@ -625,6 +616,13 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev)
DBG_MSG("slicoss: %s iounmap dev->base_addr[%x]\n", __func__, DBG_MSG("slicoss: %s iounmap dev->base_addr[%x]\n", __func__,
(uint) dev->base_addr); (uint) dev->base_addr);
iounmap((void __iomem *)dev->base_addr); iounmap((void __iomem *)dev->base_addr);
/* free multicast addresses */
mlist = adapter->mcastaddrs;
while (mlist) {
mcaddr = mlist;
mlist = mlist->next;
kfree(mcaddr);
}
ASSERT(adapter->card); ASSERT(adapter->card);
card = adapter->card; card = adapter->card;
ASSERT(card->adapters_allocated); ASSERT(card->adapters_allocated);
......
...@@ -7,6 +7,7 @@ TODO: ...@@ -7,6 +7,7 @@ TODO:
- remove wrappers - remove wrappers
- checkpatch.pl cleanups - checkpatch.pl cleanups
- new functionality that the card needs - new functionality that the card needs
- remove reliance on x86
Please send patches to: Please send patches to:
Greg Kroah-Hartman <gregkh@suse.de> Greg Kroah-Hartman <gregkh@suse.de>
......
此差异已折叠。
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#define FALSE (0) #define FALSE (0)
#define TRUE (1) #define TRUE (1)
typedef struct _LIST_ENTRY { typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *nle_flink; struct _LIST_ENTRY *nle_flink;
struct _LIST_ENTRY *nle_blink; struct _LIST_ENTRY *nle_blink;
...@@ -69,35 +68,32 @@ typedef struct _LIST_ENTRY { ...@@ -69,35 +68,32 @@ typedef struct _LIST_ENTRY {
/* These two have to be inlined since they return things. */ /* These two have to be inlined since they return things. */
static __inline PLIST_ENTRY static __inline PLIST_ENTRY RemoveHeadList(list_entry * l)
RemoveHeadList(list_entry *l)
{ {
list_entry *f; list_entry *f;
list_entry *e; list_entry *e;
e = l->nle_flink; e = l->nle_flink;
f = e->nle_flink; f = e->nle_flink;
l->nle_flink = f; l->nle_flink = f;
f->nle_blink = l; f->nle_blink = l;
return (e); return (e);
} }
static __inline PLIST_ENTRY static __inline PLIST_ENTRY RemoveTailList(list_entry * l)
RemoveTailList(list_entry *l)
{ {
list_entry *b; list_entry *b;
list_entry *e; list_entry *e;
e = l->nle_blink; e = l->nle_blink;
b = e->nle_blink; b = e->nle_blink;
l->nle_blink = b; l->nle_blink = b;
b->nle_flink = l; b->nle_flink = l;
return (e); return (e);
} }
#define InsertTailList(l, e) \ #define InsertTailList(l, e) \
do { \ do { \
list_entry *b; \ list_entry *b; \
...@@ -120,7 +116,6 @@ RemoveTailList(list_entry *l) ...@@ -120,7 +116,6 @@ RemoveTailList(list_entry *l)
(l)->nle_flink = (e); \ (l)->nle_flink = (e); \
} while (0) } while (0)
#define ATK_DEBUG 1 #define ATK_DEBUG 1
#if ATK_DEBUG #if ATK_DEBUG
...@@ -133,7 +128,6 @@ RemoveTailList(list_entry *l) ...@@ -133,7 +128,6 @@ RemoveTailList(list_entry *l)
#define SLIC_TIMESTAMP(value) #define SLIC_TIMESTAMP(value)
#endif #endif
/****************** SXG DEFINES *****************************************/ /****************** SXG DEFINES *****************************************/
#ifdef ATKDBG #ifdef ATKDBG
...@@ -150,5 +144,4 @@ RemoveTailList(list_entry *l) ...@@ -150,5 +144,4 @@ RemoveTailList(list_entry *l)
#define WRITE_REG64(a,reg,value,cpu) sxg_reg64_write((a),(&reg),(value),(cpu)) #define WRITE_REG64(a,reg,value,cpu) sxg_reg64_write((a),(&reg),(value),(cpu))
#define READ_REG(reg,value) (value) = readl((void __iomem *)(&reg)) #define READ_REG(reg,value) (value) = readl((void __iomem *)(&reg))
#endif /* _SLIC_OS_SPECIFIC_H_ */ #endif /* _SLIC_OS_SPECIFIC_H_ */
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
{ \ { \
if (!(a)) { \ if (!(a)) { \
DBG_ERROR("ASSERT() Failure: file %s, function %s line %d\n",\ DBG_ERROR("ASSERT() Failure: file %s, function %s line %d\n",\
__FILE__, __FUNCTION__, __LINE__); \ __FILE__, __func__, __LINE__); \
} \ } \
} }
#endif #endif
......
此差异已折叠。
此差异已折叠。
...@@ -34,7 +34,7 @@ static PHY_UCODE PhyUcode[] = { ...@@ -34,7 +34,7 @@ static PHY_UCODE PhyUcode[] = {
*/ */
/* Addr, Data */ /* Addr, Data */
{0xc017, 0xfeb0}, /* flip RX_LOS polarity (mandatory */ {0xc017, 0xfeb0}, /* flip RX_LOS polarity (mandatory */
/* patch for SFP+ applications) */ /* patch for SFP+ applications) */
{0xC001, 0x0428}, /* flip RX serial polarity */ {0xC001, 0x0428}, /* flip RX serial polarity */
{0xc013, 0xf341}, /* invert lxmit clock (mandatory patch) */ {0xc013, 0xf341}, /* invert lxmit clock (mandatory patch) */
...@@ -43,7 +43,7 @@ static PHY_UCODE PhyUcode[] = { ...@@ -43,7 +43,7 @@ static PHY_UCODE PhyUcode[] = {
{0xc210, 0x8000}, /* reset datapath (mandatory patch) */ {0xc210, 0x8000}, /* reset datapath (mandatory patch) */
{0xc210, 0x0000}, /* reset datapath (mandatory patch) */ {0xc210, 0x0000}, /* reset datapath (mandatory patch) */
{0x0000, 0x0032}, /* wait for 50ms for datapath reset to */ {0x0000, 0x0032}, /* wait for 50ms for datapath reset to */
/* complete. (mandatory patch) */ /* complete. (mandatory patch) */
/* Configure the LED's */ /* Configure the LED's */
{0xc214, 0x0099}, /* configure the LED drivers */ {0xc214, 0x0099}, /* configure the LED drivers */
...@@ -52,15 +52,15 @@ static PHY_UCODE PhyUcode[] = { ...@@ -52,15 +52,15 @@ static PHY_UCODE PhyUcode[] = {
/* Transceiver-specific MDIO Patches: */ /* Transceiver-specific MDIO Patches: */
{0xc010, 0x448a}, /* (bit 14) mask out high BER input from the */ {0xc010, 0x448a}, /* (bit 14) mask out high BER input from the */
/* LOS signal in 1.000A */ /* LOS signal in 1.000A */
/* (mandatory patch for SR code)*/ /* (mandatory patch for SR code) */
{0xc003, 0x0181}, /* (bit 7) enable the CDR inc setting in */ {0xc003, 0x0181}, /* (bit 7) enable the CDR inc setting in */
/* 1.C005 (mandatory patch for SR code) */ /* 1.C005 (mandatory patch for SR code) */
/* Transceiver-specific Microcontroller Initialization: */ /* Transceiver-specific Microcontroller Initialization: */
{0xc04a, 0x5200}, /* activate microcontroller and pause */ {0xc04a, 0x5200}, /* activate microcontroller and pause */
{0x0000, 0x0032}, /* wait 50ms for microcontroller before */ {0x0000, 0x0032}, /* wait 50ms for microcontroller before */
/* writing in code. */ /* writing in code. */
/* code block starts here: */ /* code block starts here: */
{0xcc00, 0x2009}, {0xcc00, 0x2009},
......
...@@ -221,7 +221,7 @@ static void usbip_dump_request_type(__u8 rt) ...@@ -221,7 +221,7 @@ static void usbip_dump_request_type(__u8 rt)
static void usbip_dump_usb_ctrlrequest(struct usb_ctrlrequest *cmd) static void usbip_dump_usb_ctrlrequest(struct usb_ctrlrequest *cmd)
{ {
if (!cmd) { if (!cmd) {
printk(" %s : null pointer\n", __FUNCTION__); printk(" %s : null pointer\n", __func__);
return; return;
} }
......
...@@ -202,7 +202,7 @@ static void vhci_rx_pdu(struct usbip_device *ud) ...@@ -202,7 +202,7 @@ static void vhci_rx_pdu(struct usbip_device *ud)
ret = usbip_xmit(0, ud->tcp_socket, (char *) &pdu, sizeof(pdu), 0); ret = usbip_xmit(0, ud->tcp_socket, (char *) &pdu, sizeof(pdu), 0);
if (ret != sizeof(pdu)) { if (ret != sizeof(pdu)) {
uerr("receiving pdu failed! size is %d, should be %d\n", uerr("receiving pdu failed! size is %d, should be %d\n",
ret, sizeof(pdu)); ret, (unsigned int)sizeof(pdu));
usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); usbip_event_add(ud, VDEV_EVENT_ERROR_TCP);
return; return;
} }
......
config W35UND config W35UND
tristate "Winbond driver" tristate "Winbond driver"
depends on MAC80211 && WLAN_80211 && EXPERIMENTAL && !4KSTACKS depends on MAC80211 && WLAN_80211 && USB && EXPERIMENTAL && !4KSTACKS
default n default n
---help--- ---help---
This is highly experimental driver for winbond wifi card on some Kohjinsha notebooks This is highly experimental driver for winbond wifi card on some Kohjinsha notebooks
......
...@@ -5,6 +5,7 @@ TODO: ...@@ -5,6 +5,7 @@ TODO:
- remove typedefs - remove typedefs
- remove unused ioctls - remove unused ioctls
- use cfg80211 for regulatory stuff - use cfg80211 for regulatory stuff
- fix 4k stack problems
Please send patches to Greg Kroah-Hartman <greg@kroah.com> and Please send patches to Greg Kroah-Hartman <greg@kroah.com> and
Pavel Machek <pavel@suse.cz> Pavel Machek <pavel@suse.cz>
...@@ -24,7 +24,7 @@ void DesiredRate2InfoElement(PWB32_ADAPTER Adapter, u8 *addr, u16 *iFildOffset, ...@@ -24,7 +24,7 @@ void DesiredRate2InfoElement(PWB32_ADAPTER Adapter, u8 *addr, u16 *iFildOffset,
u8 *pBasicRateSet, u8 BasicRateCount, u8 *pBasicRateSet, u8 BasicRateCount,
u8 *pOperationRateSet, u8 OperationRateCount); u8 *pOperationRateSet, u8 OperationRateCount);
void BSSAddIBSSdata(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData); void BSSAddIBSSdata(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData);
unsigned char boCmpMacAddr( PUCHAR, PUCHAR ); unsigned char boCmpMacAddr( u8 *, u8 *);
unsigned char boCmpSSID(struct SSID_Element *psSSID1, struct SSID_Element *psSSID2); unsigned char boCmpSSID(struct SSID_Element *psSSID1, struct SSID_Element *psSSID2);
u16 wBSSfindSSID(PWB32_ADAPTER Adapter, struct SSID_Element *psSsid); u16 wBSSfindSSID(PWB32_ADAPTER Adapter, struct SSID_Element *psSsid);
u16 wRoamingQuery(PWB32_ADAPTER Adapter); u16 wRoamingQuery(PWB32_ADAPTER Adapter);
...@@ -42,11 +42,11 @@ void RateReSortForSRate(PWB32_ADAPTER Adapter, u8 *RateArray, u8 num); ...@@ -42,11 +42,11 @@ void RateReSortForSRate(PWB32_ADAPTER Adapter, u8 *RateArray, u8 num);
void Assemble_IE(PWB32_ADAPTER Adapter, u16 wBssIdx); void Assemble_IE(PWB32_ADAPTER Adapter, u16 wBssIdx);
void SetMaxTxRate(PWB32_ADAPTER Adapter); void SetMaxTxRate(PWB32_ADAPTER Adapter);
void CreateWpaIE(PWB32_ADAPTER Adapter, u16* iFildOffset, PUCHAR msg, struct Management_Frame* msgHeader, void CreateWpaIE(PWB32_ADAPTER Adapter, u16* iFildOffset, u8 *msg, struct Management_Frame* msgHeader,
struct Association_Request_Frame_Body* msgBody, u16 iMSindex); //added by WS 05/14/05 struct Association_Request_Frame_Body* msgBody, u16 iMSindex); //added by WS 05/14/05
#ifdef _WPA2_ #ifdef _WPA2_
void CreateRsnIE(PWB32_ADAPTER Adapter, u16* iFildOffset, PUCHAR msg, struct Management_Frame* msgHeader, void CreateRsnIE(PWB32_ADAPTER Adapter, u16* iFildOffset, u8 *msg, struct Management_Frame* msgHeader,
struct Association_Request_Frame_Body* msgBody, u16 iMSindex);//added by WS 05/14/05 struct Association_Request_Frame_Body* msgBody, u16 iMSindex);//added by WS 05/14/05
u16 SearchPmkid(PWB32_ADAPTER Adapter, struct Management_Frame* msgHeader, u16 SearchPmkid(PWB32_ADAPTER Adapter, struct Management_Frame* msgHeader,
......
...@@ -25,9 +25,9 @@ typedef struct tkip ...@@ -25,9 +25,9 @@ typedef struct tkip
s32 bytes_in_M; // # bytes in M s32 bytes_in_M; // # bytes in M
} tkip_t; } tkip_t;
//void _append_data( PUCHAR pData, u16 size, tkip_t *p ); //void _append_data( u8 *pData, u16 size, tkip_t *p );
void Mds_MicGet( void* Adapter, void* pRxLayer1, PUCHAR pKey, PUCHAR pMic ); void Mds_MicGet( void* Adapter, void* pRxLayer1, u8 *pKey, u8 *pMic );
void Mds_MicFill( void* Adapter, void* pDes, PUCHAR XmitBufAddress ); void Mds_MicFill( void* Adapter, void* pDes, u8 *XmitBufAddress );
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册