SAN FRANCISCO (AP) -- If Vernon Davis keeps this up, perhaps the San Francisco 49ers can stop worrying about the passing game until Michael Crabtree returns from injury next month.
Davis caught touchdown passes of 61 and 35 yards and finished with a career-best 180 yards receiving, leading the 49ers past the Arizona Cardinals 32-20 on Sunday for their third straight victory.
Colin Kaepernick threw for 252 yards and Frank Gore ran for 101 yards on 25 carries.
Kendall Hunter ran for a 6-yard touchdown that sealed it for the 49ers (4-2) with 6:35 remaining.
Rookie safety Eric Reid made his team-leading third interception and also recovered a fumble to stop an Arizona drive deep in 49ers territory in the third quarter. San Francisco forced four turnovers for the second straight game.
Arizona (3-3) lost star defensive end Calais Campbell to an apparent right leg injury late in the game.
For the 49ers, this balanced offensive performance was something they have searched for from Week 1.
Kaepernick got back on track after four straight games of fewer than 200 yards passing.
Carson Palmer was 25 of 41 for 298 yards with a 75-yard touchdown pass to Larry Fitzgerald, but inconsistent play plagued Arizona's offense again.
Trailing 22-14 late in the second quarter, Cardinals missed a big opportunity to take some momentum into halftime. Michael Floyd was flagged for offensive pass interference when he pushed Tarell Brown out of the way before making what would have been a 44-yard touchdown catch.
Floyd redeemed himself with a 10-yard touchdown catch midway through the third quarter in which he got by Brown in the left corner of the end zone. But Arizona failed on a 2-point conversion try, leaving the 49ers up 22-20.
The Cardinals' much-improved defense took a big blow when Campbell was carted off with 4:56 left. He was hurt when his leg buckled beneath him on a tackle of Gore.
Fitzgerald didn't seem hampered by a tender hamstring when he split two defenders as the 49ers tried for another interception, and his touchdown put Arizona ahead 7-6 late in the first quarter.
Fitzgerald fumbled after a catch late in the third quarter on a hit by Patrick Willis, and Reid recovered. All-Pro linebacker Willis returned for San Francisco after missing two games with a groin injury.
There was some question whether Fitzgerald would play, with the Cardinals gearing up for two games in a five-day stretch; the Seahawks visit the desert Thursday night. But he played in his 96th straight game.
After Fitzgerald scored, San Francisco took charge in a wild sequence.
Kaepernick's tipped pass intended for Bruce Miller near the goal line was intercepted by Yeremiah Bell. But San Francisco turned that bad break into a go-ahead safety when Corey Lemonier took Palmer down in the end zone for his first career sack, putting the 49ers ahead 8-7.
Two plays after Arizona's free kick, Kaepernick found Davis for the 61-yard TD.