--- zzzz-none-000/linux-2.4.17/drivers/net/irda/sa1100_ir.c 2001-10-25 20:53:47.000000000 +0000 +++ sangam-fb-322/linux-2.4.17/drivers/net/irda/sa1100_ir.c 2004-11-24 13:23:26.000000000 +0000 @@ -38,11 +38,7 @@ #include -#ifndef CONFIG_SA1100_H3600 -#define clr_h3600_egpio(x) do { } while (0) -#define set_h3600_egpio(x) do { } while (0) -#endif - +/* Yopy wants fixing */ #ifndef GPIO_IRDA_FIR #define GPIO_IRDA_FIR (0) #endif @@ -174,10 +170,16 @@ if (machine_is_assabet()) ASSABET_BCR_clear(ASSABET_BCR_IRDA_FSEL); - if (machine_is_h3600()) - clr_h3600_egpio(EGPIO_H3600_IR_FSEL); +#ifdef CONFIG_SA1100_H3XXX + if (machine_is_h3xxx()) + clr_h3600_egpio(IPAQ_EGPIO_IR_FSEL); +#endif if (machine_is_yopy()) PPSR &= ~GPIO_IRDA_FIR; +#ifdef CONFIG_SA1100_PFS168 + if (machine_is_pfs168()) + PFS168_SYSCTLA_clear(PFS168_SYSCTLA_IRDA_FSEL); +#endif si->speed = speed; @@ -199,10 +201,16 @@ if (machine_is_assabet()) ASSABET_BCR_set(ASSABET_BCR_IRDA_FSEL); - if (machine_is_h3600()) - set_h3600_egpio(EGPIO_H3600_IR_FSEL); +#ifdef CONFIG_SA1100_H3XXX + if (machine_is_h3xxx()) + set_h3600_egpio(IPAQ_EGPIO_IR_FSEL); +#endif if (machine_is_yopy()) PPSR |= GPIO_IRDA_FIR; +#ifdef CONFIG_SA1100_PFS168 + if (machine_is_pfs168()) + PFS168_SYSCTLA_set(PFS168_SYSCTLA_IRDA_FSEL); +#endif sa1100_irda_rx_alloc(si); sa1100_irda_rx_dma_start(si); @@ -240,18 +248,17 @@ return 0; } +#ifdef CONFIG_SA1100_H3XXX /* * This turns the IRDA power on or off on the Compaq H3600 */ static inline int sa1100_irda_set_power_h3600(struct sa1100_irda *si, unsigned int state) { - if (state) - set_h3600_egpio(EGPIO_H3600_IR_ON); - else - clr_h3600_egpio(EGPIO_H3600_IR_ON); + assign_h3600_egpio( IPAQ_EGPIO_IR_ON, state ); return 0; } +#endif /* * This turns the IRDA power on or off on the Yopy @@ -267,6 +274,28 @@ } /* + * This sets the IRDA power level on the PFS-168. + */ +#ifdef CONFIG_SA1100_PFS168 +static inline int +sa1100_irda_set_power_pfs168(struct sa1100_irda *si, unsigned int state) +{ + static unsigned int pfs168_state[4] = { + PFS168_SYSCTLB_IRDA_MD0, + PFS168_SYSCTLB_IRDA_MD1|PFS168_SYSCTLB_IRDA_MD0, + PFS168_SYSCTLB_IRDA_MD1, + 0 }; + + if (state < 4) { + state = pfs168_state[state]; + PFS168_SYSCTLB_clear(state ^ (PFS168_SYSCTLB_IRDA_MD_MASK)); + PFS168_SYSCTLB_set(state); + } + return 0; +} +#endif + +/* * Control the power state of the IrDA transmitter. * State: * 0 - off @@ -283,10 +312,16 @@ if (machine_is_assabet()) ret = sa1100_irda_set_power_assabet(si, state); - if (machine_is_h3600()) +#ifdef CONFIG_SA1100_H3XXX + if (machine_is_h3xxx()) ret = sa1100_irda_set_power_h3600(si, state); +#endif if (machine_is_yopy()) ret = sa1100_irda_set_power_yopy(si, state); +#ifdef CONFIG_SA1100_PFS168 + if (machine_is_pfs168()) + ret = sa1100_irda_set_power_pfs168(si, state); +#endif return ret; } @@ -727,11 +762,6 @@ netif_wake_queue(dev); } -/* - * Note that we will never build up a backlog of frames; the protocol is a - * half duplex protocol which basically means we transmit a frame, we - * receive a frame, we transmit the next frame etc. - */ static int sa1100_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) { struct sa1100_irda *si = dev->priv; @@ -758,6 +788,8 @@ } if (!IS_FIR(si)) { + netif_stop_queue(dev); + si->tx_buff.data = si->tx_buff.head; si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, si->tx_buff.truesize);