// while
}
-void c_can_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj)
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_update_filter
+//
+// update acceptance filter for given object.
+//
+
+void c_can_irq_update_filter(struct canchip_t *pchip, struct msgobj_t *obj)
+{
+ struct canfilt_t filt;
+
+ if(canqueue_ends_filt_conjuction(obj->qends, &filt)) {
+ obj->rx_preconfig_id=filt.id;
+
+ if (filt.flags&MSG_EXT)
+ can_msgobj_set_fl(obj,RX_MODE_EXT);
+ else
+ can_msgobj_clear_fl(obj,RX_MODE_EXT);
+
+ c_can_mask(obj, filt.mask, 0);
+
+ c_can_pre_read_config(pchip, obj);
+
+ CANMSG("c_can_irq_update_filter: obj #%d\n",obj->object);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_sync_activities
+//
+// ensure, that not requests for object activities are serialized.
+//
+
+void c_can_irq_sync_activities(struct canchip_t *pchip, struct msgobj_t *obj)
{
while (!can_msgobj_test_and_set_fl(obj, TX_LOCK)) {
- /*if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) {
- if(canobj_read_reg(chip,obj,iMSGCTL1)&TXRQ_RES)
- i82527_irq_write_handler(chip, obj);
- }
+ if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) {
+ int cctreqx;
+ int idxobj = obj->object-1;
+
+ if(idxobj<0) {
+ DEBUGMSG("c_can_irq_sync_activities wrong idxobj\n");
+ break;
+ }
+
+ if(idxobj < 16)
+ cctreqx = c_can_read_reg_w(pchip, CCTREQ1);
+ else
+ cctreqx = c_can_read_reg_w(pchip, CCTREQ2);
- if(!obj->tx_slot) {
- if(can_msgobj_test_and_clear_fl(obj,FILTCH_REQUEST)) {
- i82527_irq_update_filter(chip, obj);
- }
- } */
- /* FIXME: these functionality has to be implemented to start TX */
+ if (!(cctreqx & (1 << (idxobj & 0xf)))) {
+ can_msgobj_clear_fl(obj, TX_REQUEST);
+ c_can_irq_write_handler(pchip, idxobj);
+ }
+ }
+
+ if(!obj->tx_slot) {
+ if(can_msgobj_test_and_clear_fl(obj,FILTCH_REQUEST)) {
+ c_can_irq_update_filter(pchip, obj);
+ }
+ }
can_msgobj_clear_fl(obj, TX_LOCK);
+
+ mb();
+
if (can_msgobj_test_fl(obj, TX_REQUEST))
continue;
if (can_msgobj_test_fl(obj, FILTCH_REQUEST) && !obj->tx_slot)
#endif /*CAN_WITH_STATISTICS */
//return; // continue?
} else {
- if (irqreg > 0 && irqreg < 33) {
+ if (irqreg >= 1 && irqreg <= 32) {
struct msgobj_t *pmsgobj;
int idxobj;
}
//transfer Message Object to IF1 Buffer
if (c_can_if1_busycheck(pchip)) ;
+
c_can_write_reg_w(pchip, readMaskCM, CCIF1CM);
c_can_write_reg_w(pchip, idxobj + 1, CCIF1CR);
IFXARB2_DIR) {
spin_unlock(&c_can_if1lock);
c_can_irq_write_handler(pchip, idxobj);
+
+ if(!pmsgobj->tx_slot){
+ if(can_msgobj_test_and_clear_fl(pmsgobj, FILTCH_REQUEST)) {
+ c_can_irq_update_filter(pchip, pmsgobj);
+ }
+ }
} else {
if (can_msgobj_test_fl
(pmsgobj, RX_MODE_EXT)) {
}
spin_unlock(&c_can_if1lock);
- //}
}
//else
}
- //if
+ //if (irqreg >= 1 && irqreg <= 32)
}
// Get irq status again
irqreg = c_can_read_reg_w(pchip, CCINTR);